1837: 考试(New Online Judge)
题目描述
n个学生正在参加一场考试,考试包含均为k道对错题,每道题值一分。
由于答案未知,你可以设定每道题的答案,要使得最低的分数尽可能的高。
你能达到的最低分数是多少?
输入
第一行为两个正整数n和k,1≤n≤1000,1≤k≤10。
接下来n行,每行包含k个字符,要么为T,要么为F,表示第i位同学的k道题的答案。
输出
输出一个数字表示答案。
样例输入
5 4
TFTF
TFFF
TFTT
TFFT
TFTF
样例输出
2
题解1(C++版本)
#include<bits/stdc++.h>
using namespace std;
int n, k;
char s[1010][15];
int main(){
scanf("%d%d", &n, &k);
getchar();
for(int i = 1; i <= n; i++) scanf("%s", s[i] + 1);
int res = 0; //记录使得最低的分数尽可能高的题目数量
for(int t = 0; t < (1<<k); t++){ //枚举[0000,1111]共16种情况,0101表示第1题和第3题的答案是F ,第2题和第4题的答案是T
int curMinNum = k; //记录当前答案下,答对题目最少的数量
for(int i = 1; i <= n; i++){
int rightNum = 0; //记录每位同学答对的题目数量
for(int j = 0; j < k; j++){
if( ( (t&(1<<j)&& s[i][j + 1] == 'T') ) || ( (!(t&(1<<j)) && s[i][j + 1] == 'F') ) ){ //这题答案是T/F,并且这位同学的答案也是T/F
rightNum++;
}
}
curMinNum = min(curMinNum, rightNum);
}
res = max(res, curMinNum);
}
printf("%d\n", res);
return 0;
}