PAT 甲级 1153 Decode Registration Card of PAT

Note

  • 排序
  • unordered_map防止超时

Code:

#include<bits/stdc++.h>
using namespace std;

char lev;
int n,m,sc,ty,te;
unordered_map<char,int> lti;
unordered_map<int,int> cnt,total,dti;

struct node{
	string id;
	char level;
	int site,date,testee,score;
}stu[10010];

struct ttt{
	int site,count;
	ttt(){}
	ttt(int s,int c){
		site=s,count=c;
	}
};

bool cmp(node a,node b){
	if(a.level!=b.level) return a.level<b.level;
	if(a.score!=b.score) return a.score>b.score;
	else return a.id<b.id;
}

bool cmp1(ttt a,ttt b){
	if(a.count!=b.count) return a.count>b.count;
	else return a.site<b.site;
}

vector<ttt> vc[10010];
int main(){
	#ifndef ONLINE_JUDGE
	freopen("data.txt","r",stdin);
	#endif
	
	string id;
	int index=1,j,size;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>id>>sc;
		stu[i].id=id;
		stu[i].level=id[0];
		stu[i].site=stoi(id.substr(1,3));
		stu[i].date=stoi(id.substr(4,6));
		stu[i].testee=stoi(id.substr(10));
		stu[i].score=sc;
		
		cnt[stu[i].site]++;
		total[stu[i].site]+=sc;
		
		if(dti[stu[i].date]==0){
			dti[stu[i].date]=index;
			vc[index].push_back(ttt(stu[i].site,1));
			index++;
		}
		else{
			size=vc[dti[stu[i].date]].size();
			j=0;
			for(;j<size;j++){
				if(stu[i].site==vc[dti[stu[i].date]][j].site){
					vc[dti[stu[i].date]][j].count++;
					break;
				}
			}
			if(j==size)
				vc[dti[stu[i].date]].push_back(ttt(stu[i].site,1));
		}
	}
	
	for(int i=1;i<index;i++){
		if(!vc[i].empty()){
			sort(vc[i].begin(),vc[i].end(),cmp1);
		}
	}
	
	sort(stu+1,stu+n+1,cmp);
	char last=stu[1].level;
	lti[last]=1;
	for(int i=2;i<=n;i++){
		if(stu[i].level!=last){
			last=stu[i].level;
			lti[last]=i;
		}
	}
	
	for(int i=1;i<=m;i++){
		cin>>ty;
		printf("Case %d: %d ",i,ty);
		if(ty==1){
			cin>>lev;
			printf("%c\n",lev);
			if(lti[lev]==0){
				printf("NA\n");
				continue;
			}
			for(int k=lti[lev];;k++){
				if(stu[k].level!=lev) break;
				printf("%s %d\n",stu[k].id.c_str(),stu[k].score);
			}
		}
		else if(ty==2){
			cin>>te;
			printf("%03d\n",te);
			if(cnt[te]==0&&total[te]==0) printf("NA\n");
			else printf("%d %d\n",cnt[te],total[te]);
		}
		else{
			cin>>te;
			printf("%06d\n",te);
			if(vc[dti[te]].empty()) printf("NA\n");
			else{
				for(int k=0;k<vc[dti[te]].size();k++)
					printf("%03d %d\n",vc[dti[te]][k].site,vc[dti[te]][k].count);
			}
		}
	}
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值