AOJ - Problem 1043 : Selecting Teams Advanced to Regional

ICPCのコンテストのチームの選抜に関する問題です。これくらいの問題は簡単に解けないとICPCでは歯が立たないレベルですね。

4つのデータ(正解数,ペナルティ,ID,所属)をpair > >を使ってソートします。ソートしたあとは順位のよい方からみていって条件に合うチームを選抜していきましょう。

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

int main(){
	int n;
	while( cin >> n , n ){
		vector<pair<int,pair<int,pair<int,int> > > > vc;
		vector<int> ans;
		int u[1001] = {0};

		for(int i=0 ; i < n ; i++ ){
			int ID,Univ,AC,WA;
			cin >> ID >> Univ >> AC >> WA;
			pair<int,int> a(ID,Univ);
			pair<int,pair<int,int> > b(WA,a);
			pair<int,pair<int,pair<int,int> > > c(-AC,b);
			vc.push_back( c );
		}
		sort( vc.begin() , vc.end() );
		for(int i=0 ; i < n ; i++ ){
			int AC = -vc[i].first;
			int WA = vc[i].second.first;
			int ID = vc[i].second.second.first;
			int Univ = vc[i].second.second.second;
			if( ans.size() < 10 && u[Univ] < 3 ){
				ans.push_back( ID );
				u[Univ]++;
			}else if( ans.size() < 20 && u[Univ] < 2 ){
				ans.push_back( ID );
				u[Univ]++;
			}else if( ans.size() < 26 && u[Univ] < 1 ){
				ans.push_back( ID );
				u[Univ]++;
			}
		}
		for(int i=0 ; i < ans.size() ; i++ ){
			cout << ans[i] << endl;
		}
	}
}