hdu 2093 考試排名(sscanf)
阿新 • • 發佈:2019-02-06
模擬題。
直接從教程里拉解析。
因為表格裡的資料格式不統一。有時候有"()",有時候又沒有。而它也不會給我們提示。
這種情況下,就只能它它們統一看作字串來處理了。現在就請出我們的主角sscanf()!sscanf
語法:
#include int sscanf( const char *buffer, const char *format, ... );
函式sscanf()和scanf()類似, 只是輸入從buffer(緩衝區)中讀取.
比如:sscanf("1 2 3", "%d%d%d", &a, &b, &c);
則a = 1, b = 2, c = 3;
只要輸入表格內容後,用格式化輸入"%d(%d)",然後判斷輸入結果,如果是2,表示帶有括號,如果是1,則沒有括號。
排序直接用快速排序就可以了。規則已經說的很清楚了。
程式碼:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int MaxN = 1000; struct student { char name[11]; int sum; int total; /*bool operator<(const student &a)const { if(a.total != total) return a.total > total; else if(a.sum != sum) return a.sum < sum; else return strcmp(a.name, name); }*/ } stu[MaxN]; /*int cmp(const void *va, const void *vb) { student *a, *b; a = (student*)va; b = (student*)vb; if(a->total != b->total) return a->total - b->total; else if(b->sum != a->sum) return b->sum - a->sum; else return strcmp(b->name, a->name); }*/ int cmp(const void *a, const void *b) { if ((*(student *)a).total != (*(student *)b).total) return (*(student *)a).total - (*(student *)b).total; else if ((*(student *)b).sum != (*(student *)a).sum) return (*(student *)b).sum - (*(student *)a).sum; else return strcmp((*(student *)b).name, (*(student *)a).name); } int main() { //freopen("in.txt", "r", stdin); int n, m; int i, j; scanf("%d%d", &n, &m); for(i = 0; scanf("%s", stu[i].name)!=EOF; i++) { for(j = 0; j < n; j++) { char style[10]; int t, f; scanf("%s", style); int res = sscanf(style, "%d(%d)", &t, &f); if(res == 2) { stu[i].total++; stu[i].sum += t + f * m; } else if(res == 1 && t > 0) { stu[i].total++; stu[i].sum += t; } } } qsort(stu, i, sizeof(student), cmp); for(i--; i >= 0; i--) printf("%-10s %2d %4d\n", stu[i].name, stu[i].total, stu[i].sum); return 0; }