题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2093
题目大意:
就是算出对应的排名,输出按照降序的方式。先比较ac的题目数,多的先输出,然后再是,比较罚时,少的输出,最后如果都一样,比较名字的字典顺序。罚时的算法为:罚时=正数+括号里的数字*单位罚分数;
细节
我是真的菜,翻了整个一整页没有一个大神说出这一点。就是写完之后测试数据的时候,需要输入EOF,然而我不知怎么输入,一直以为是自己的程序错了,然后就无从下手。最后还是去查了下:EOF的输入在windows系统下,是control键+z再加回车就是相当于是EOF。如果不加EOF的话,这个cmd窗口就不会输出结果的。
AC代码
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct player{
char name[15];
int acnum;
int score;
}pl[10000];
bool cmp(player x,player y){//用来指定排序顺序的函数
if(x.acnum!=y.acnum) return x.acnum>y.acnum;
else if(x.score!=y.score) return x.score<y.score;
else return strcmp(x.name,y.name)<0;//按照字母字典顺序来排序
}
int main(){
//字符数组转整型
// char str[5]="1324";
// int num = 0;
// for(int i = 0;i<strlen(str);i++){
// printf("str:%d\n",str[i]);
// printf("0:%d\n",'0');
// num =num*10+(str[i]-'0');
// printf("%d\n",num);
// }
int n,m;
scanf("%d%d",&n,&m);
char str[200];
int i=0;
int error;//用来记算罚时的错题数
int num;//用来记录解题的时间
while(scanf("%s",&pl[i].name)!=EOF){
pl[i].acnum = 0;//初始化pl选手的数据值
pl[i].score = 0;
int k;
for(int j = 0;j < n;j++){
scanf("%s",&str);
num = 0;
error = 0;
if(str[0]=='-') continue;//如果为负数则直接跳到下一个操作
if(strcmp(str,"0") == 0) continue;
for(k = 0;k<strlen(str);k++){
if(str[k]=='('){
break;
}
num = num*10+(str[k]-'0');//获取AC的时间
}
if(k!=strlen(str)){//表示之前检测到了'(',所以要进行这个操作
for(k=k+1;k<strlen(str);k++){
if(str[k]==')'){
break;
}
error =error*10+(str[k]-'0');//获取ac后的计算错误题的提交次数 ,用于计算罚时
}
}
pl[i].acnum ++;
pl[i].score += (num+error*m);
}
i++;
}
sort(pl,pl+i,cmp);
for(int h = 0;h < i;h++){
printf("%-10s%3d%5d\n",pl[h].name,pl[h].acnum,pl[h].score);
}
return 0;
}