PAT A 1153 AC代码(耗时100ms以内)

在这种数据处理复杂并且可能输出较多的情况下

!!!牢记:多次读取,多次输出的地方(循环中),能用scanf和printf就不要用cin和cout

这道题就是典型的换输出方法会导致耗时非常显著变化的例子

最终的耗时非常可观,都控制在100ms以内,远远低于200的限制

 

 使用了多个map来避免每次都对所有记录遍历,读取数据的时候就完成数据处理

写的时候为了每种情况写得更加直观,设置的类型比较多

#include<iostream>
#include<vector>
#include<unordered_map>
#include<algorithm>
using namespace std;
int N,M;
struct node{
	string id;
	int score;
};
struct node2{
	int num2;
	int total;
};
struct node3{
	string site;
	int num3;
};
bool cmp1(const node a,const node b){
	if(a.score==b.score){
		return a.id<b.id;
	}else{
		return a.score>b.score;
	}
}
bool cmp2(const node3 a,const node3 b){
	if(a.num3==b.num3){
		return a.site<b.site;
	}else{
		return a.num3>b.num3;
	}
}
vector<node> T,A,B;
unordered_map<string,node2> two;
unordered_map<string,unordered_map<string,int>> three;
int main(){
	cin>>N>>M;
	for(int i=0;i<N;i++){
		string a;
		int b;
		cin>>a>>b;
		if(a[0]=='T'){
			T.push_back(node{a,b});
		}else if(a[0]=='A'){
			A.push_back(node{a,b});
		}else{
			B.push_back(node{a,b});
		}
		
		string site=a.substr(1,3);
		two[site].num2++;
		two[site].total+=b;
		
		string date=a.substr(4,6);
		three[date][site]++;
	}
	sort(T.begin(),T.end(),cmp1);
	sort(A.begin(),A.end(),cmp1);
	sort(B.begin(),B.end(),cmp1);
	for(int i=0;i<M;i++){
		int q;
		string s;
		cin>>q>>s;
		printf("Case %d: %d %s\n", i+1, q, s.c_str());
		if(q==1){
			if(s=="T"){
				if(T.size()==0){
					printf("NA\n");
					continue;
				}
				for(auto it:T){
					printf("%s %d\n",it.id.c_str(),it.score);
				}
			}else if(s=="A"){
				if(A.size()==0){
					printf("NA\n");
					continue;
				}
				for(auto it:A){
					printf("%s %d\n",it.id.c_str(),it.score);
				}
			}else{
				if(B.size()==0){
					printf("NA\n");
					continue;
				}
				for(auto it:B){
					printf("%s %d\n",it.id.c_str(),it.score);
				}
			}
		}else if(q==2){
			if(two.find(s)!=two.end()){
				printf("%d %d\n",two[s].num2,two[s].total);
			}else{
				printf("NA\n");
			}
		}else{
			if(three.find(s)!=three.end()){
				vector<node3> v;
				for(auto it=three[s].begin();it!=three[s].end();it++){
					v.push_back(node3{it->first,it->second});
				}
				sort(v.begin(),v.end(),cmp2);
				for(auto it:v){
					printf("%s %d\n",it.site.c_str(),it.num3);
				}
			}else{
				printf("NA\n");
			}
		}
	}
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值