题目描述
某学校进行了一次英语考试,共有10道是非题,每题为10分,解答用1表示“是”,用0表示“非”的方式。但老师批完卷后,发现漏批了一张试卷,而且标准答案也丢失了,手头只剩下了3张标有分数的试卷。
试卷一:① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩
0 0 1 0 1 0 0 1 0 0 得分:70
试卷二:① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩
0 1 1 1 0 1 0 1 1 1 得分:50
试郑三:① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩
0 1 1 1 0 0 0 1 0 1 得分:30
待批试卷:① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩
0 0 1 1 1 0 0 1 1 1 得分:?
请编一程序依据这三张试卷,算出漏批的那张试卷的分数。
题目分析
原题出在DFS专题,先用DFS做了一遍,但这个题第一眼的想法是用位运算,后来学长也提到了,网上也搜不到,所以自己写一遍
AC代码
#include<bits/stdc++.h>
using namespace std;
int a[5]= {164,471,453,231};
//0010100100 0111010111 0111000101 0011100111转换成十进制
int b[5];
//用来储存枚举得分
int main() {
int n=10;
//一共有10道题,所以答案的种类数为2e10 1024
for(int i = 0; i <= 1<<n ; i ++) {
//第一层,枚举每一种答案
for(int j=0; j<4; j++) {
int t=a[j],tt=i,k=10;
while(k--) {
if((t&1) == (tt&1))
b[j]++;
t>>=1;
tt>>=1;
}
}
//第二层,找到这种答案对应的得分
if(b[0]==7 && b[1]==5 && b[2]==3) {
cout<<b[3]*10;
return 0;
}
//判断是否符合题意,达到终止标准
for(int j=0; j<4; j++)
b[j]=0;
//init 为下一次循环重新初始化
}
return 0;
}