代码
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;
struct Student{
string name;
int acNum;
int penalty;
};
int stringToInt(string str){
stringstream ss;
ss<<str;
int num;
ss>>num;
return num;
}
int compare(Student stu1, Student stu2){
if(stu1.acNum!=stu2.acNum){
return stu1.acNum > stu2.acNum;
}
else{
if(stu1.penalty!=stu2.penalty){
return stu1.penalty < stu2.penalty;
}
else{
return stu1.name < stu2.name;
}
}
}
int main() {
int n, m;
cin>>n>>m;
vector<Student> v;
string name;
while(cin>>name){
Student stu;
int acNum = 0;
int penalty = 0;
for(int i=0; i<n; i++){
string tmp;
cin>>tmp;
int pos = tmp.find('(');
if(pos==-1){
int intTmp = stringToInt(tmp);
if(intTmp>0){
acNum++;
penalty += intTmp;
}
}
else{
acNum++;
int posEnd = tmp.find(')');
int wrongNum = stringToInt(tmp.substr(pos+1, posEnd-pos-1));
penalty = penalty + wrongNum*m;
penalty = penalty + stringToInt(tmp.substr(0, pos));
}
}
stu.name = name;
stu.acNum = acNum;
stu.penalty = penalty;
v.push_back(stu);
}
sort(v.begin(), v.end(), compare);
for(int i=0; i<v.size(); i++){
Student s = v.at(i);
printf("%-10s %2d %4d\n", s.name.c_str(), s.acNum, s.penalty);
}
return 0;
}
注解
1、每题的答题情况分为以下三种:
(1)正数,不带括号。表示该题一次提交成功。在计算penalty时直接加上该数即可。
(2)正数,带括号。先找出括号的位置,括号前面是用时,计算penalty加上该部分。括号里面表示错误的提交次数,因计算罚时,所以在计算penalty时还要加上罚时。
(3)负数。表明该题未提交成功,不计算罚时。
2、正确提交题目数,是情况(1)、(2)的数目之和。
3、结构体排序。包含姓名、正确题目数、总罚时三部分。先按正确题目数排序,再按总罚时排序,最后按姓名排序。
4、输出格式:左对齐,字符串,占10格:%-10s。不写"-"默认右对齐。
5、c++要用printf输出字符串时,要转换成c格式的字符串,方法是str.c_str()。
6、常用的int转string和string转int方法。
7、vector的插入、查找、排序。