1153 Decode Registration Card of PAT (25分) 真、真的会超时吗?!

因为一直说答案错误所以来这边看了看
发现好多人超时,陷入了极致迷惑:什么这会超时?!
然后再细看,什么要用容器?!
果然这就是大神的苦恼吗!
就这道题而言还是可以用点别的方法的?
我的结果图
在这里插入图片描述

我又臭又长但非常容易写所以也不会考虑那么多的代码

/*--帽---*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int n,m;
struct student{
	char id[15];
	char level;
	int site,date,num,score;
}stu[10010];
struct countt{
	int id,cnt;
}cou[1000];

void change(int x){
	char c[15];
	strcpy(c,stu[x].id);
	stu[x].level=c[0];
	stu[x].site=(c[1]-'0')*100+(c[2]-'0')*10+(c[3]-'0');
	stu[x].date=(c[4]-'0')*100000+(c[5]-'0')*10000+(c[6]-'0')*1000+(c[7]-'0')*100+(c[8]-'0')*10+(c[9]-'0');
}

bool cmp1(student a,student b){
	if(a.score!=b.score) return a.score>b.score;
	else return strcmp(a.id,b.id)<0;
}

bool cmp2(countt a,countt b){
	if(a.cnt!=b.cnt) return a.cnt>b.cnt;
	else return a.id<b.id;
}

void leveldeal(){
	char term;
	int flag=0;
	getchar();
	scanf("%c",&term);
	printf("%c\n",term);
	for(int i=0;i<n;i++){
		if(term==stu[i].level){
			printf("%s %d\n",stu[i].id,stu[i].score);
			flag=1;
		}
	}
	if(flag==0) printf("NA\n");
}

void sitedeal(){
	int term,num=0,cnt=0;
	scanf("%d",&term);
	printf("%d\n",term);
	for(int i=0;i<n;i++){
		if(stu[i].site==term){
			cnt++;
			num+=stu[i].score;
		}
	}
	if(cnt==0) printf("NA\n");
	else printf("%d %d\n",cnt,num);
}

void datedeal(){
	int term,flag=0;
	scanf("%d",&term);
	printf("%06d\n",term);
	for(int i=0;i<n;i++){
		if(stu[i].date==term){
			int tmp=stu[i].site;
			cou[tmp].id=tmp;
			cou[tmp].cnt++;
		}
	}
	sort(cou+101,cou+1000,cmp2);
	for(int i=101;i<=1000;i++){
		if(cou[i].cnt>0){
			printf("%d %d\n",cou[i].id,cou[i].cnt);
			cou[i].id=0; cou[i].cnt=0;
			flag=1;
		}else break;
	}
	if(!flag) printf("NA\n");
}

int main(){
	int i,j,type;
	freopen("input.txt","r",stdin);
	scanf("%d%d",&n,&m);
	for(i=0;i<n;i++){
		scanf("%s %d",stu[i].id,&stu[i].score);
		change(i);
	}
	sort(stu,stu+n,cmp1);
	for(i=0;i<m;i++){
		scanf("%d",&type);
		switch(type){
			case 1:{
				printf("Case %d: 1 ",i+1);
				leveldeal();
				break;
			}
			case 2:{
				printf("Case %d: 2 ",i+1);
				sitedeal();
				break;
			}
			case 3:{
				printf("Case %d: 3 ",i+1);
				datedeal();
				break;
			}
			default:{
				printf("NA\n");
				break;
			}
		}
	}
	
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值