PAT A1141 PAT Ranking of Institutions

题目难度:两颗半星
题目大意:给出一串成绩提交的记录,要求最后给出每个学校的排名。
题目坑点:输入需要scanf,不然最后两个会超时,而且没想到什么很省时间的方法,因此800ms的时间勉强通过,这里复习了之前的map转vector然后排序的方法,需要记住的是cmp中两个参数定义pair时,访问的时候是点访问,不是箭头访问,因为不是指针。
很奇怪的一个问题就是:刚开始的时候没有统一输入输出的方式,然后改了输出 用printf,但是发现居然会超时,估计可能是因为输出的时候用了一个string转char数组的函数。估计还是解题方法不好,每次都是压时间过。

奇怪的又发生了 一会儿可以过一会儿不能过的,,,要命
代码如下:

#include<iostream>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<map>
#include<set>
#include<string>
using namespace std;
typedef struct Univercity{
	set<string> stu;
	int A,B,T,weight;
	Univercity(){
		A=0;B=0;T=0;
	}
}Univercity;
bool cmp(const pair<string,Univercity> a,const pair<string,Univercity> b){
	if(a.second.weight!=b.second.weight){
		return a.second.weight>b.second.weight;
	}
	else if(a.second.stu.size()!=b.second.stu.size()){
		return a.second.stu.size()<b.second.stu.size();
	}
	else 
		return a.first<b.first;
}
int main(){
	int N,sc;
	scanf("%d",&N);
	char id[10],u[10];
	string ID,univ;
	map<string,Univercity> m;
	while(N--){
		scanf("%s %d %s",id,&sc,u);
		ID=id;
		univ=u;
		transform(univ.begin(),univ.end(),univ.begin(),::tolower);
		m[univ].stu.insert(ID);
		switch(ID[0]){
			case 'A':
				m[univ].A+=sc;break;
			case 'B':
				m[univ].B+=sc;break;
			case 'T':
				m[univ].T+=sc;break;
		}
	}
	for(map<string,Univercity>::iterator it=m.begin();it!=m.end();it++){
		Univercity temp=it->second;
		it->second.weight=(int)(temp.B/1.5+temp.A+temp.T*1.5);
	}
	vector<pair<string,Univercity> > v(m.begin(),m.end());
	sort(v.begin(),v.end(),cmp);
	printf("%d\n",v.size());
	int rank=1;
	for(int i=0;i<v.size();i++){
		if(i!=0){
			if(v[i].second.weight==v[i-1].second.weight)
				printf("%d",rank);
			else{
				printf("%d",i+1);
				rank=i+1;
			}
			
		}
		else{
			printf("%d",rank);
		}
		cout<<" "<<v[i].first<<" "<<v[i].second.weight<<" "<<v[i].second.stu.size()<<endl;
	}
}


发布了124 篇原创文章 · 获赞 0 · 访问量 1282
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览