题意:
读取所给的人的做题的信息,来通过做题的数量,罚时等对这一组人进行排序。
思路:
即给定一组数据,其中包含了每个人的人名,解题的数量,以及错题罚时等信息,在读入人数量和单位罚时的后,一次读出每个人的自己的做题信息,来判断做题的多少,来对这些人的成绩进行排序。用结构题来存储每个人的信息,用字符数组读入人名,再读入成绩。注意每次cin后,判断,如果是正数,则做题数加1,并且做题时间加上。负数则不管,每次读入数据后,用getchar读入后一个字符,判断,如果是(,则读入括号中的数字,乘上单位罚时,加入到时间中去。再用getchar消化后一个),随后再cin读入下一个数据。第一次getchar读入的如果是不是(,则直接cin读入下一个数据。直到读入所有的数据后,结束。结构体中记得重载<,先以做题数量正序排列,再以罚时升序排列,最后以顺序排列,然后用sort函数排序后输出。最后注意输出时的格式要求。
总结:
这个题目主要是要判断字符的读取问题,即如何读出数字后,判断后面有没有括号,然后需要读出括号中的内容,其他的实现慢慢写还行。(但在最后的格式输出的时候,一开始用的cin和cout,只有第一名字左对齐了,其后的所有都右对齐了,后来用的printf挺好使,不知道哪里的问题。)
代码:
#include <iostream>
#include <queue>
#include <stack>
#include <algorithm>
#include <iomanip>
using namespace std;
struct P{
char name[10]; //姓名
int a; //正确的题数
int b; //罚时
int c; //一开始的顺序
bool operator<(const P &p){
if(a != p.a) return a>p.a; //题数的降序
if(b != p.b) return b<p.b; //罚时的升序
return c<p.c;
}
}ps[2000];
int main(){
int m, n;
cin>>m>>n;
int k=0;
int score=0;
char c;
while(cin>>ps[k].name){
for(int i=0; i<m; i++){ //依次读入成绩
cin>>score;
if(score>0){ //做出来了
ps[k].a++; //题目数增加
ps[k].b+=score; //罚时
}
c=getchar();
if(c=='('){ //判断是否有括号,里面有罚时
cin>>score;
ps[k].b=ps[k].b+score*n;
c=getchar(); //消化 )
}
}
k++;
}
sort(ps,ps+k); //排序
for(int i=0; i<k;i++ ){ //输出
printf("%-10s ",ps[i].name);
printf("%2d ",ps[i].a);
printf("%4d\n",ps[i].b);
}
return 0;
}