这题的题目意思不难理解,关键在于获得它们的排名他,还要按照输入顺序输出得分。 要点: ①创建结构数组s储存每个学生做对的题数和用的时间。 ②拷贝一个①里面的结构数组a,然后对a排序,得到每个学生的排名,排名从0开始。0是最高的排名。 ③判断(当前排名-比当前答对题数多的人数)是否大于或等于答对当前题数的一半人数。
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
struct student{
int ac;
int h;
int min;
int sec;
};
student s[100],a[100];
bool cmp(student x,student y);
bool operator==(const student&x,const student&y){
return (x.ac==y.ac&&x.h==y.h&&x.min==y.min&&x.sec==y.sec);
}
int main()
{
int num,i,j;
int p1,p2,p3,p4,p5,top,f;
while(scanf("%d",&num)!=EOF&&num>=0){
p1=0;p2=0;p3=0;p4=0;p5=0;
for(i=0;i<num;i++){
scanf("%d",&s[i].ac);
scanf("%d:%d:%d",&s[i].h,&s[i].min,&s[i].sec);
a[i].ac=s[i].ac;
a[i].h=s[i].h;a[i].min=s[i].min;a[i].sec=s[i].sec;
}
sort(a,a+num,cmp);
for(i=0;i<num;i++){
if(s[i].ac==5) p5++;
if(s[i].ac==4) p4++;
if(s[i].ac==3) p3++;
if(s[i].ac==2) p2++;
if(s[i].ac==1) p1++;
}
for(i=0;i<num;i++){
if(s[i].ac==5) printf("100\n");
if(s[i].ac==4){
for(j=0;j<num;j++){
if(s[i]==a[j]) top=j;
}
f=p4/2;
if(top-p5>=f) printf("90\n");
else printf("95\n");
}
if(s[i].ac==3){
for(j=0;j<num;j++){
if(s[i]==a[j]) top=j;
}
f=p3/2;
if(top-p5-p4>=f) printf("80\n");
else printf("85\n");
}
if(s[i].ac==2){
for(j=0;j<num;j++){
if(s[i]==a[j]) top=j;
}
f=p2/2;
if(top-p5-p4-p3>=f) printf("70\n");
else printf("75\n");
}
if(s[i].ac==1){
for(j=0;j<num;j++){
if(s[i]==a[j]) top=j;
}
f=p1/2;
if(top-p5-p4-p3-p2>=f) printf("60\n");
else printf("65\n");
}
if(s[i].ac==0) printf("50\n");
}
printf("\n");
}
}
bool cmp(student x,student y)
{
if(x.ac!=y.ac) return x.ac>y.ac;
if(x.h!=y.h) return x.h<y.h;
if(x.min!=y.min) return x.min<y.min;
else return x.sec<y.sec;
}
|