c ++ Programmation Exercices 043: jeux de combat à sang froid

programmation du Nord et des algorithmes (c) Résumé quiz (printemps 2020)


description

Afin de répondre aux Jeux olympiques de 2008, de sorte que nous puissions mieux comprendre les différents sports de combat, facer a ouvert un nouveau jeux de combat à sang froid. jeux de combat système d'adhésion, mais les nouveaux membres ne ont pas besoin de payer les frais d'entrée, aussi longtemps que jouer un match d'exhibition avec un vieux membres, de prouver leur force.

Nous partons du principe que la force de combat peut être un entier positif, la valeur devient la force, la force des deux valeurs peut être le même. De plus, chaque personne a un identifiant unique, il est un entier positif. Afin de rendre le look meilleur jeu, chaque joueur choisira une nouvelle force avec sa plus proche race humaine, qui est la valeur absolue de la différence entre la valeur de la force des deux équipes aussi faible que possible, avec sa valeur de force personnelle si la même différence comment, alors il choisira l'identifiant du plus petit.

Malheureusement, Facer accidentellement perdu le record de la course, mais il conserve les dossiers des membres inscrits. Maintenant, pourriez-vous reprendre l'aide désileur jouer enregistrement, dans l'ordre chronologique de la sortie de chaque jeu entre l'identifiant deux côtés.

Entrez
la première ligne d'un nombre n (0 <n <= 100000 ), le champ de combat indique le nombre de nouveaux membres (non compris facer). N chaque rangée après rangée de deux nombres, étant donné la force de l'identifiant et la valeur de l' adhésion en fonction de la composition du temps. Un début, facer même un membre, id est 1, les valeurs de résistance de 1 milliard.

Sortie
N lignes de deux chiffres, à la fois l'id, id novice EDITORIAL par match.

entrée d' échantillon
. 3
2. 3
. 3. 1
. 4 2
de sortie d' échantillon
2. 1
. 3 2
. 4 2


analyse

La question doit noter que la force de combat peut être un entier positif, la valeur devient la force, la force des deux valeurs sont les mêmes, vous pouvez choisir de multimapmettre en œuvre le stockage de données, et en raison de la présence de personnes de la même force, alors nous après chaque comparaison, peut être la même force, mais laisser le plus petit nombre, le plus grand nombre ont été supprimés, car il n'est pas supprimé, les opérations ultérieures, peuvent choisir de ne pas répondre aux conditions de sujets: les valeurs de force personnelle avec la même différence si la façon dont il est il choisira l'identifiant du plus petit.

#include<iostream>
#include<map>
using namespace std;
multimap<int ,int> data;
void Delete_max(multimap<int ,int>::iterator i,multimap<int ,int>::iterator j)
{
	if(i->first == j->first){//id相同的 
		if(i->second < j->second)//去掉较大值 
			data.erase(j);
		else
			data.erase(i);
	}
}
int main()
{
	int id,power,num;
	data.insert(make_pair(1000000000,1));//第一个数据 
	cin >> num;
	while(num --)
	{
		cin >> id >> power;
		multimap<int ,int>::iterator im,in,i,j;
		im = data.insert(make_pair(power,id));
		i = im,--i;
		j = im,++j;
		if(im == data.begin()){
			in = im;
			in++;
		 	cout<<im->second <<" "<< in->second << endl;
		 	Delete_max(im,in);
		}
		else if(im == (--data.end())){
			in = im;
			--in;
			cout<<im->second <<" "<< in->second << endl;
			Delete_max(im,in);
		}
		else{
			int d1 = abs(im->first - i->first);
			int d2 = abs(im->first - j->first);
			if(d1 < d2  || d1 == d2 && i->second < j->second){
				cout<<im->second <<" "<< i->second<<endl;
				Delete_max(im,i);
			}
			else{
				cout<<im->second <<" "<< j->second<<endl;
				Delete_max(im,j);
			}
		}
		
	}
}
 
Publié 222 articles originaux · a gagné les éloges 48 · vues 20000 +

Je suppose que tu aimes

Origine blog.csdn.net/qq_44116998/article/details/104420162
conseillé
Classement