这题甚至可以不用看题面,直接看输入输出
第1和2种类型直接模拟即可,注意排序条件
对于第3种类型,我第一次用的是map存储,然后便利map容器,保存数据然后排序
用map超时1一个点,改用数组,最后便利101-999的数,也能解决
注意,找不到要输出“”NA“”
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
typedef struct node{
char lx;
string kc;
string rq;
string bh;
string zong;
int num;
}node;
typedef struct temp{
int bh;
int num;
}temp;
node no[10004];
temp t[10004];
bool cmp(node n1,node n2){
if(n1.num==n2.num) return n1.zong<n2.zong;
return n1.num>n2.num;
}
bool cmp1(temp n1,temp n2){
if(n1.num==n2.num) return n1.bh<n2.bh;
return n1.num>n2.num;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
char s[20];
scanf("%s%d",s,&no[i].num);
int len=strlen(s);
no[i].lx=s[0];
no[i].zong=s;
no[i].kc="";
no[i].rq="";
no[i].bh="";
for(int j=1;j<=3;j++) no[i].kc+=s[j];
for(int j=4;j<=9;j++) no[i].rq+=s[j];
for(int j=10;j<len;j++) no[i].bh+=s[j];
// cout<<no[i].kc<<endl;
}
sort(no,no+n,cmp);
for(int i=0;i<m;i++){
int c;
scanf("%d",&c);
if(c==1){
char s;
getchar();
scanf("%c",&s);
int flag=0;
printf("Case %d: %d %c\n",i+1,c,s);
for(int j=0;j<n;j++){
if(no[j].lx==s){
flag=1;
printf("%s %d\n",no[j].zong.c_str(),no[j].num);
}
}
if(flag==0) printf("NA\n");
}
else if(c==2){
char s1[20];
scanf("%s",s1);
string s=s1;
printf("Case %d: %d %s\n",i+1,c,s.c_str());
int cnt=0;
int sum=0;
for(int j=0;j<n;j++){
if(no[j].kc==s){
cnt++;
sum+=no[j].num;
}
}
if(cnt==0) printf("NA\n");
else
printf("%d %d\n",cnt,sum);
}
else if(c==3){
char s1[20];
scanf("%s",s1);
string s=s1;
printf("Case %d: %d %s\n",i+1,c,s.c_str());
int cnt=0;
int a[2000]={0};
for(int j=0;j<n;j++){
if(no[j].rq==s){
int sum=0;
for(int k=0;k<3;k++) sum=sum*10+no[j].kc[k]-'0';
a[sum]++;
}
}
for(int j=101;j<=999;j++){
if(a[j]!=0){
t[cnt].bh=j;
t[cnt++].num=a[j];
}
}
sort(t,t+cnt,cmp1);
for(int j=0;j<cnt;j++) printf("%d %d\n",t[j].bh,t[j].num);
if(cnt==0) printf("NA\n");
}
else{
printf("NA\n");
}
}
return 0;
}
欢迎大家加入 早起学习群,一起学习一起进步!(群号:642179511)