網教14. 比賽計分問題

在 ACM/ICPC 地區賽中,參賽隊可以直接提交題目答案,但若答案錯誤,則再次提交時最後的成績會受到影響。比賽的測試系統對每次提交的程序進行評判,結果是 AC 或者某種錯誤,參賽隊能看到這個結果。

爲了獎勵優秀的隊伍同時確定進軍世界總決賽的資格名單,當兩個隊伍做出的題目數量相同時,會按照其使用的時間來進行進一步的排名。時間有兩個部分,第一是總的解題時間,二是懲罰時間。所謂懲罰時間是指提交程序未通過時被罰的時間,每一次未通過的提交,都會在最終用於排名的時間中增加 20 分鐘。對於沒解決的題目不計時。

你的程序將讀入一張運行結果清單,然後打印出前三名的成績。

輸入

輸入文件包含若干測試數據集。

每個測試數據由兩個部分組成,第一部分包含了一個正整數,它表示參賽隊伍的個數。接下來的幾行是每次提交的結果。每行表示一次提交的結果,包括提交時間、隊伍編號、問題編號和裁定結果。

當一行中提交時間一項爲 0 時,則表示當前的數據集結束。當參賽隊伍的個數爲 0 時,則表示全部輸入的結束。

每個測試集中隊伍的個數不超過 100 個,提交的次數不超過 10000 次。

輸出

針對每一組輸入,輸出前三名的比分,包括隊號、做出題數、比賽用時、名次。在輸出排名前,要輸出“case n”,其中 n 表示當前是第幾組輸入。

假設:可能有好幾隊在同一名次。比如如果有幾隊都是第三名,則將他們全部輸出;如果有兩隊是第二名,則沒有第三名。當隊伍名次相同時,按照隊伍編號從小到大輸出。

  測試輸入關於“測試輸入”的幫助 期待的輸出關於“期待的輸出”的幫助 時間限制關於“時間限制”的幫助 內存限制關於“內存限制”的幫助 額外進程關於“{$a} 個額外進程”的幫助
測試用例 1 以文本方式顯示
  1. 3↵
  2. 12 1 2 yes↵
  3. 14 3 2 no↵
  4. 25 3 1 yes↵
  5. 29 1 1 no↵
  6. 38 3 2 yes↵
  7. 39 2 1 no↵
  8. 45 1 1 no↵
  9. 0↵
  10. 0↵
以文本方式顯示
  1. case 1:↵
  2. 3 2 83 1↵
  3. 1 1 12 2↵
  4. 2 0 0 3↵
1秒 1024KB 0
題解:
這個題不是很難,就是計數就行了。科普一個知識:ACM一般不會超過12道題,所以開記錄這個的數組時開15一定就夠用了。
一開始我的讀入方法很麻煩,先讀字符串,然後再從字符串裏分割。後來發現可以直接讀scanf("%d%d%d%s",&time,&team,&que,s);感覺發現了黑科技。。。
計分的時候是yes了之後才把計時和罰時都加上,而不是no的時候就加。一開始這裏寫錯了,後來開一個15大小的數組記錄,就行了。
有一個要注意的問題是,兩個並列第一的話下一名就是第三了,好多同學在這裏卡住。
AC代碼:
#include<stdio.h>  
#include<string.h>  
#include<math.h>  
struct  node{  
    int a, b, c, d[15];  
}sco[105];//a存隊伍號,b存總成績,c存做出的題,d每個題的罰時  
  
char readin[10005][20];  
int main()  
{  
    int m, n;  
    n = 0;  
    while (1)  
    {  
        n++;  
        scanf("%d", &m);  
//      getchar();  
        if (m == 0)  
            break;  
        memset(readin, 0, sizeof(readin));  
        int j;  
        for (j = 1; j <= m; j++)  
        {  
            sco[j].a = j;  
            sco[j].b = 0;  
            sco[j].c = 0;  
            int k;  
            for (k = 0; k < 15; k++)  
                sco[j].d[k] = 0;  
        }  
        int i = 0;  
        while (1)  
        {  
            gets(readin[i]);  
            if (readin[i][0] == '0'&&readin[i][1] == '\0')  
                break;  
            int len,sco1=0, team=0, que=0;  
            len = strlen(readin[i]);  
            for (j = 0; j < len;j++)  
            if (readin[i][j] == ' ')  
                break;//現在j存的是空格  
            int t;  
            for (t = 0; t < j; t++)  
                sco1 += pow(10.0, j - 1 - t)*(readin[i][t]-'0');  
            for (t = j + 1; t < len;t++)  
            if (readin[i][t] == ' ')  
                break;//現在t存的是空格  
            for (j = j+1; j < t; j++)  
                team += pow(10.0, t - 1 - j)*(readin[i][j] - '0');  
            for (j = t + 1; j < len;j++)  
            if (readin[i][j] == ' ')  
                break;  
            for (t = t+1; t < j; t++)  
                que += pow(10.0, j - 1 - t)*(readin[i][t] - '0');  
              
            if (readin[i][j + 1] == 'y')  
            {  
                sco[team].b += sco1 + sco[team].d[que];  
                sco[team].c++;  
            }  
            else  
                sco[team].d[que] += 20;  
  
            i++;  
        }//字符串做法  
/*      int sco1 = 0, team = 0, que = 0; 
        char ac[5]; 
        scanf("%d", &sco1); 
        while (sco1 != 0) 
        { 
            scanf("%d%d%s", &team, &que, &ac); 
            if (ac[0] == 'y') 
            { 
                sco[team].b += sco1 + sco[team].d[que]; 
                sco[team].c++; 
            } 
            else 
                sco[team].d[que] += 20; 
            scanf("%d", &sco1); 
        }//數字做法*/  
        for (i = 1; i <= m;i++)  
        for (j = 1; j<=m - i;j++)  
        if (sco[j + 1].c>sco[j].c)  
        {  
            int tmp;  
            tmp = sco[j].a;  
            sco[j].a = sco[j + 1].a;  
            sco[j + 1].a = tmp;  
            tmp = sco[j].b;  
            sco[j].b = sco[j + 1].b;  
            sco[j + 1].b = tmp;  
            tmp = sco[j].c;  
            sco[j].c = sco[j + 1].c;  
            sco[j + 1].c = tmp;  
        }  
        else if (sco[j + 1].c == sco[j].c)  
        {  
            if (sco[j + 1].b < sco[j].b)  
            {  
                int tmp;  
                tmp = sco[j].a;  
                sco[j].a = sco[j + 1].a;  
                sco[j + 1].a = tmp;  
                tmp = sco[j].b;  
                sco[j].b = sco[j + 1].b;  
                sco[j + 1].b = tmp;  
                tmp = sco[j].c;  
                sco[j].c = sco[j + 1].c;  
                sco[j + 1].c = tmp;  
            }  
            else if (sco[j + 1].b == sco[j].b)  
            if (sco[j + 1].a<sco[j].a)  
            {  
                int tmp;  
                tmp = sco[j].a;  
                sco[j].a = sco[j + 1].a;  
                sco[j + 1].a = tmp;  
                tmp = sco[j].b;  
                sco[j].b = sco[j + 1].b;  
                sco[j + 1].b = tmp;  
                tmp = sco[j].c;  
                sco[j].c = sco[j + 1].c;  
                sco[j + 1].c = tmp;  
            }  
        }  
        printf("case %d:\n", n);  
        int tmp=1;  
        int maxe = 4;  
        if (m < 3)  
            maxe = m + 1;  
        for (i = 1; i < maxe; i++)  
        {  
            printf("%d %d %d %d\n", sco[i].a,sco[i].c,sco[i].b,tmp);  
            while (i < m&&sco[i].b == sco[i + 1].b && sco[i].c == sco[i + 1].c)  
            {  
                i++;  
                printf("%d %d %d %d\n", sco[i].a, sco[i].c, sco[i].b, tmp);  
            }  
            tmp = i+1;  
        }  
    }  
    return 0;  
}  



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章