因为一直说答案错误所以来这边看了看
发现好多人超时,陷入了极致迷惑:什么这会超时?!
然后再细看,什么要用容器?!
果然这就是大神的苦恼吗!
就这道题而言还是可以用点别的方法的?
我的结果图
我又臭又长但非常容易写所以也不会考虑那么多的代码
/*--帽---*/
#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;
}