题解 P3692 【夏幻的考试】

其实这题很简单啊,代码也没有必要写那么长

就是按题目说的模拟

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <bits/stdc++.h>
using namespace std;
int n,m,ans[55];//ans[i]为第i题的正确序号(0,1,2,3)
string s;
int main(){
ios::sync_with_stdio(false);
cin>>n>>m>>s;
for (int i=0;i<m;i++)ans[i]=s[i]-'A';//读入标准答案
while (n--){
double cnt=0;
int kh=0;
cin>>s;
for (int i=15;i>=0;i--)kh+=(s[i]-'0')*pow(2,15-i);//算考号
bool khzq=kh>=1&&kh<=10000;//检查是否合法
if (!khzq){
for (int i=0;i<=m;i++)cin>>s;
printf ("Wrong ID\n\n");continue;//不合法
}
cin>>s;
if (s[0]==s[1])s[kh&1]='0';//如果两个都填了或者两个都没填,让它变成错误
//不难发现考号%2就是最后一位,因为2的方冥都是偶的
printf ("ID: %d\nType %s\n",kh,s[kh&1]-'0'?"Correct":"Incorrect");//输出ID和是否正确
for (int i=0;i<m;i++){
cin>>s;
bool ok=0,f=0;
for (int j=0;j<4;j++)if (s[j]-'0'&&ok)f=1;//如果填了两个
else if (s[j]-'0')ok=1;//如果填了
if (ok&&!f&&s[ans[i]]-'0')cnt+=100.0/m;//只填了一个且填的是对的
}
printf ("%.1f\n\n",cnt);//输出
}
return 0;
}