目录
1.德才论
其实这一题的关键在于考生被分成了五类,在每一类里按照成绩输出,所以应该在结构体里定义一个类别,而类别在输入信息时就可以鉴定出来
#include <cstdio>
#include <cctype>
#include <cstring>
#include <math.h>
#include <algorithm>
using namespace std;
struct student{
char id[10];
int de;
int cai;
int sum;
int flag;
}stu[100000];
bool cmp(student a,student b){
if(a.flag!=b.flag){
return a.flag<b.flag;
}else if(a.sum!=b.sum){
return a.sum>b.sum;
}else if(a.de!=b.de){
return a.de>b.de;
}else{
return strcmp(a.id,b.id)<0;
}
}
int main(){
int num,min,max;
scanf("%d %d %d",&num,&min,&max);
int de,cai;
int final_num = num;
for(int i=0;i<num;i++){
scanf("%s %d %d",&stu[i].id,&stu[i].de,&stu[i].cai);
de = stu[i].de;
cai = stu[i].cai;
stu[i].sum=stu[i].cai+stu[i].de;
if(de>=max&&cai>=max){
stu[i].flag=1;
}else if(de>=max&&cai>=min){
stu[i].flag=2;
}else if(de>=min&&de>=cai&&cai>=min){
stu[i].flag=3;
}else if(de>=min&&cai>=min){
stu[i].flag=4;
}else{
stu[i].flag=5;
final_num-=1;
}
}
sort(stu,stu+num,cmp);
printf("%d\n",final_num);
for(int i=0;i<final_num;i++){
printf("%s %d %d %d\n",stu[i].id,stu[i].de,stu[i].cai,stu[i].flag);
}
return 0;
}
2.THE BEST RANKS
这题因为id比较小,可以用整数表示
所以对每一个人,也就是每一个id,都有对应的四个排名,创建一个数组用id当横坐标,随后四列分别代表四个科目
#include <cstdio>
#include <cctype>
#include <cstring>
#include <math.h>
#include <algorithm>
using namespace std;
struct student{
int id;
int score[4];//A C M E
}stu[2001];
int sort_by;
int rank[10000002][4];
bool cmp(student a,student b){
return a.score[sort_by]>b.score[sort_by];
}
int main(){
int m,n;
scanf("%d %d",&m,&n);
for(int i=0;i<m;i++){
scanf("%d %d %d %d",&stu[i].id,&stu[i].score[1],&stu[i].score[2],&stu[i].score[3]);
stu[i].score[0] = stu[i].score[1]+stu[i].score[2]+stu[i].score[3];
}
for(sort_by =0;sort_by<4;sort_by++){
sort(stu,stu+m,cmp);
rank[stu[0].id][sort_by] = 1;
for(int i=1;i<m;i++){
if(stu[i].score[sort_by]==stu[i-1].score[sort_by]){
rank[stu[i].id][sort_by] = rank[stu[i-1].id][sort_by];
}else{
rank[stu[i].id][sort_by] = i+1;
}
}
}
int inquire;
char w[4] = {'A','C','M','E'};
for(int j=0;j<n;j++){
scanf("%d",&inquire);
if(rank[inquire][0]==0){
printf("N/A\n");
}else{
int k =0;
for(int i=0;i<4;i++){
if(rank[inquire][i]<rank[inquire][k]){
k = i;
}
}
printf("%d %c\n",rank[inquire][k],w[k]);
}
}
return 0;
}