PAT 1025 PAT Ranking

#include<iostream>
#include<string>
#include<queue>
#include<vector>
#include<cmath>
#include<iomanip>
#include<algorithm>
using namespace std;

struct Student
{
	string stu_id;
	int finRank;
	int locNum;
	int locRank;
	int score;
};


bool greaterMark(const Student &stu1, const Student &stu2)
{
	if(stu1.score != stu2.score)
		return stu1.score > stu2.score; //分数比较
	else
		return string(stu1.stu_id) < string(stu2.stu_id);
		//return strcmp(stu1.stu_id , stu2.stu_id)<0; //学号按非升序排列
}

bool cmp (const Student &stu1, const Student &stu2)
{
	return stu1.stu_id < stu2.stu_id;
}


void initRank(vector<Student> &vStu, bool isFinal)
{
	int rank = 1;
	for(int i=0; i<vStu.size(); i++)
	{
		//处理名次重复的问题
		if(i && vStu[i].score != vStu[i-1].score)
			rank = i+1;
		if(isFinal)
			vStu[i].finRank = rank;
		else
			vStu[i].locRank = rank;
	}
}

void initOneLocationStuInfo(vector<Student> &vTmpStu)
{
	sort(vTmpStu.begin(), vTmpStu.end(), greaterMark);
	initRank(vTmpStu,false);
}

//input
void input(vector<Student> &vAllStu)
{
	int i,j,k,n;
	cin>>n;
	Student stuTmp;	
	vector<Student> vTmpStu;
	for(i=1; i<=n; i++)
	{
		cin>>k;
		vTmpStu.clear();
		for(j=1; j<=k; j++)
		{
			cin>>stuTmp.stu_id;
			cin>>stuTmp.score;
			stuTmp.locNum = i;
			vTmpStu.push_back(stuTmp);
		}
		//init locNum and locRank
		initOneLocationStuInfo(vTmpStu);
		//将vTmpStu中的信息merge到vAllStu中。
		vAllStu.insert(vAllStu.end(), vTmpStu.begin(), vTmpStu.end() );
		
	}
}

void initFinalRank(vector<Student> &vAllStu)
{
	sort(vAllStu.begin(), vAllStu.end(), greaterMark);
	initRank(vAllStu,true);
}




void output(vector<Student> &vAllStu)
{
	cout<<vAllStu.size()<<endl;
	for(vector<Student>::iterator it=vAllStu.begin(); it!=vAllStu.end(); it++)
		cout<<it->stu_id<<" "<<it->finRank<<" "<<it->locNum<<" "<<it->locRank<<endl;
}

int main()
{
	int n,i;
	vector<Student> vAllStu;
	input(vAllStu);	
	initFinalRank(vAllStu);
	output(vAllStu);	
	return 0;
}

  

posted @ 2012-12-10 16:39  Frank@609  Views(478)  Comments(0Edit  收藏  举报