PAT (Basic Level) Practice 1058 選擇題
阿新 • • 發佈:2018-12-10
問題描述:
1058 選擇題 (20 分)
批改多選題是比較麻煩的事情,本題就請你寫個程式幫助老師批改多選題,並且指出哪道題錯的人最多。
輸入格式:
輸入在第一行給出兩個正整數 N(≤ 1000)和 M(≤ 100),分別是學生人數和多選題的個數。隨後 M 行,每行順次給出一道題的滿分值(不超過 5 的正整數)、選項個數(不少於 2 且不超過 5 的正整數)、正確選項個數(不超過選項個數的正整數)、所有正確選項。注意每題的選項從小寫英文字母 a 開始順次排列。各項間以 1 個空格分隔。最後 N 行,每行給出一個學生的答題情況,其每題答案格式為 (選中的選項個數 選項1 ……)
,按題目順序給出。注意:題目保證學生的答題情況是合法的,即不存在選中的選項數超過實際選項數的情況。
輸出格式:
按照輸入的順序給出每個學生的得分,每個分數佔一行。注意判題時只有選擇全部正確才能得到該題的分數。最後一行輸出錯得最多的題目的錯誤次數和編號(題目按照輸入的順序從 1 開始編號)。如果有並列,則按編號遞增順序輸出。數字間用空格分隔,行首尾不得有多餘空格。如果所有題目都沒有人錯,則在最後一行輸出 Too simple
。
輸入樣例:
3 4 3 4 2 a c 2 5 1 b 5 3 2 b c 1 5 4 a b d e (2 a c) (2 b d) (2 a c) (3 a b e) (2 a c) (1 b) (2 a b) (4 a b d e) (2 b d) (1 e) (2 b c) (4 a b c d)
輸出樣例:
3
6
5
2 2 3 4
問題分析:這道題是一道挺綜合性的應用題,其實難度不大,就是思路要理清,把每位學生的得分跟每道題目的錯誤次數分開考慮,對了一道就把得分加給學生,錯一道就把次數加給錯誤次數即可。。emmm...我好像只是把題目解釋了一遍。。好吧,我知道你們都很聰明,相信你們都理解了,那就看程式碼吧!!
程式碼實現:
#include <bits/stdc++.h> using namespace std; struct node {//每道題的資訊。。 int N;//編號 int score;//分數 int num;//選項數 int oknum;//正確選項數 int wrongtime;//錯誤次數 char choice[5];//正確選項 }p[105]; char str[10005]; int cmp(node a, node b)//一個比較直接的快排,大家都懂吧。。 { if(a.wrongtime != b.wrongtime) return a.wrongtime > b.wrongtime; else return a.N < b.N; } int main() { int grade[1005] = {0};//記錄每位學生的得分 int n, m, i, j, k, u, len, flag; cin >> n >> m; for(i = 0; i < m; i++)//輸入 { cin >> p[i].score >> p[i].num >> p[i].oknum; p[i].wrongtime = 0; p[i].N = i; for(j = 0; j < p[i].oknum; j++) cin >> p[i].choice[j]; } getchar(); for(i = 0; i < n; i++) { cin.getline(str, 10005); len = strlen(str); flag = k = u = 0; for(j = 0; j < len; j++) { if(str[j] == '(' || str[j] == ' ')//這些可以看為分隔符,直接跳過即可 continue; if(str[j] == ')')//說明一道題結束 { if(flag)//如果這道題有錯誤 p[k].wrongtime++; else grade[i] += p[k].score;//否則加分 flag = u = 0; k++; } if(isdigit(str[j]))//選項數都不對就拜拜了 { if(str[j]-48 != p[k].oknum) { flag = 1; } } if(isalpha(str[j]) && !flag)//想什麼呢?以為自己對了? { if(str[j] == p[k].choice[u++]) continue; flag = 1;//選錯了還是拜拜 } } } for(i = 0; i < n; i++)//輸出每位學生的得分 cout << grade[i] << endl; sort(p, p+m, cmp); if(p[0].wrongtime == 0)//一道題都沒錯,不是題目簡單吧,都是人才吧?!要麼就是作弊!! printf("Too simple"); else//還是這裡比較正常 { printf("%d %d", p[0].wrongtime, p[0].N+1); for(i = 1; i < m; i++) { if(p[i].wrongtime == p[0].wrongtime) printf(" %d", p[i].N+1); else break; } } }
測試結果:
提交時間 | 狀態 | 分數 | 題目 | 編譯器 | 耗時 | 使用者 |
---|---|---|---|---|---|---|
2018/9/13 21:04:36 |
答案正確 |
20 | 1058 | C++ (g++) | 55 ms | 2016082102 |
測試點 | 結果 | 耗時 | 記憶體 |
---|---|---|---|
0 | 答案正確 | 3 ms | 380KB |
1 | 答案正確 | 3 ms | 384KB |
2 | 答案正確 | 2 ms | 276KB |
3 | 答案正確 | 55 ms | 384KB |
好吧,還是挺耗時的,大家看看就過了啊,拜拜!