题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1012
// 1. 求平均成绩/3时有精度损失,造成2个测试点错误。不要被例子误导呢 // 2. 调了半小时。题目没说明相同成绩同名次呢! // 3. 函数名要形象,不要用cmp0,cmp1... #include <stdio.h> #include <algorithm> #define SIZE 3000+100 using namespace std; struct stu { int id; // %06d int c; int m; int e; int sum; // 为了减小误差,用sum来保存三成绩的和 int rank; char method; }; int n, m; stu s[SIZE]; bool sortByA(stu sum, stu b) { return sum.sum > b.sum; } bool sortByC(stu sum, stu b) { return sum.c > b.c; } bool sortByM(stu sum, stu b) { return sum.m > b.m; } bool sortByE(stu sum, stu b) { return sum.e > b.e; } void Output() { int k; for(k=0; k<n; k++) { printf("id:%d sum:%d c:%d m:%d e:%d\n", s[k].id, s[k].sum, s[k].c, s[k].m, s[k].e); } } int main() { #ifdef ONLINE_JUDGE #else freopen("E:\\in.txt", "r", stdin); #endif scanf("%d%d", &n, &m); int i; for(i=0; i<n; i++) { scanf("%d%d%d%d", &s[i].id, &s[i].c, &s[i].m, &s[i].e); s[i].sum = s[i].c +s[i].m+s[i].e; } int rank=0; int score = -1; sort(s, s+n, sortByA); for(i=0; i<n;i++) { if(s[i].sum != score) { rank = i+1; } score = s[i].sum; s[i].rank = rank; s[i].method = 'A'; } rank =0; score=-1; sort(s, s+n, sortByC); for(i=0; i<n;i++) { if(s[i].c != score) { rank = i+1; } score = s[i].c; if(s[i].rank > rank) { s[i].rank = rank; s[i].method = 'C'; } } rank =0; score=-1; sort(s, s+n, sortByM); for(i=0; i<n;i++) { if(s[i].m != score) { rank = i+1; } score = s[i].m; if(s[i].rank > rank) { s[i].rank = rank; s[i].method = 'M'; } } rank =0; score=-1; sort(s, s+n, sortByE); for(i=0; i<n;i++) { if(s[i].e != score) { rank = i+1; } score = s[i].e; if(s[i].rank > rank) { s[i].rank = rank; s[i].method = 'E'; } } while(m-->0) { int id; scanf("%d", &id); for(i=0; i<n; i++) { if(id == s[i].id) { printf("%d %c\n", s[i].rank, s[i].method); break; } } if(i == n) { printf("N/A\n"); continue; }//no this id } return 0; }