没什么难度,只要能处理一些字符串就行了 格式很蛋疼啊PE了两次 #include <algorithm> #include <cstdio> #include <cstring> #include <iostream> using namespace std; struct Node{ char name[20]; int cnt, time; }a[50000]; bool cmp(Node p, Node q){ if(p.cnt != q.cnt) return p.cnt > q.cnt; if(p.time != q.time) return p.time < q.time; return strcmp(p.name, q.name) < 0; } int main(){ int nproblem, k, i = 0, j, penalty, x, y; char s[100]; cin >>nproblem >>penalty; while(cin >>a[i].name){ if(a[i].name[0] == '#')break; a[i].cnt = a[i].time = 0; for(j = 0; j < nproblem; j++){ cin >>s; if(s[0] == '0' || s[0] == '-') continue; a[i].cnt++; for(k = 0; s[k]; k++){ if(s[k] == '(') break; } if(s[k]){ x = y = 0; for(k = 0; s[k] != '('; k++){ x = x * 10 + s[k] - '0'; } for(k++; s[k] != ')'; k++){ y = y * 10 + s[k] - '0'; } a[i].time += x + y * penalty; }else{ x = 0; for(k = 0; s[k]; k++){ x = x * 10 + s[k] - '0'; } a[i].time += x; } } i++; } sort(a,a+i,cmp); for(j = 0; j < i; j++){ printf("%-10s %2d %4d/n",a[j].name,a[j].cnt, a[j].time); } return 0; }