题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=2093
大意就是让我们对一场考试进行名次排序,怎么排呢?AC多的人在前,AC数目相同的情况下呢,我们看花费的时间,时间少的在前,若题目做对的数目和花费的时间都相同,那么就用字典序,小的在前。表示方法就是一下几种
0 表示未开始做此题
-2 表示做了题目但没有做对,还做错了2次,但是不罚时
2(2) 也就是花了2个单位的时间,但是错了2次,这个要罚时
2 就是花了2个单位的时间做对了
大体思路:处理结构体排序,以及输入(各种EOF scanf)输出处理(左右对齐)。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct STUDENT{
char name[200];
int correct;
int cost;
};
bool cmp(STUDENT x,STUDENT y)
{
if(x.correct!=y.correct) return x.correct>y.correct;
else if(x.cost!=y.cost) return x.cost<y.cost;
else return strcmp(x.name,y.name)<0;
}
int main()
{
// freopen("sample.txt","r",stdin);
STUDENT student[200];
char s[200],wrongAns[200],costTime[200];
char *ptrBegin;
int n,m;
scanf("%d %d",&n,&m);
int i=0; //i 学生人数
while(scanf("%s",&student[i].name)!=EOF) //处理第i个学生
{
student[i].correct=0;
student[i].cost=0;
for(int j=0;j<n;j++) //j个题
{
scanf("%s",&s);
if(s[0]=='0') continue; //0
else if(s[0]=='-') continue; //-
else //m(n)
{
ptrBegin=strchr(s,'(');
if(ptrBegin) //有n
{
memset(wrongAns,0,sizeof(char));
memset(costTime,0,sizeof(char));
int t=0;
for(int k=0;k<strlen(s)-strlen(ptrBegin);k++)
{
costTime[t]=s[k];
t++;
}
costTime[t]='\0';
t=0;
for(int k=strlen(s)-strlen(ptrBegin)+1;k<strlen(s)-1;k++)
{
wrongAns[t]=s[k];
t++;
}
wrongAns[t]='\0';
student[i].cost+=atoi(costTime);
student[i].cost+=m*atoi(wrongAns);
}
else //无n
{
student[i].cost+=atoi(s);
}
student[i].correct++;
}
}
i++;
}
sort(student,student+i,cmp);
for(int k=0;k<i;k++){
printf("%-10s%3d%5d\n",student[k].name,student[k].correct,student[k].cost);
}
// fclose(stdin);
return 0;
}
由于实在是太久没有接触这个语言了,对语法和细节基本都是边百度边做的,很痛苦,我在进行杭电的100题训练提升自己。