『题解』Luogu P8254 [NOI Online 2022 普及组] 王国比赛
题目大意
有 \(n\) 到判断题,有 \(m\) 人参加答题。已知所有人的答案,你需要先预测出所有题的答案。
具体来说,对于第 \(i\) 道题,有 \(x\) 人选则 \(\checkmark\),有 \(y\) 人选择 \(\times\),那么 \(x+y=m\)。
若 \(x>y\),那么这道题的预测结果就为 \(\checkmark\),否则为 \(\times\)。
数据保证 \(m\) 为奇数。
统计完成后,你会得到正确答案(\(n\) 个整数,为 \(1\) 表示 \(\checkmark\),为 \(0\) 表示 \(\times\)),请求出你有几道题的预测结果与正确答案一致。
思路
输入时是一个人的答案占一行输入的,不是按一道题的答案!
所以我们要开一个数组 \(f_{N,2}\),在读入时记录每道题的答案有多少个 \(\checkmark\),有多少个 \(\times\)。
输入时直接输入 \(0\) 和 \(1\),所以使第 \(i\) 个人对第 \(j\) 道题的答案计数加上 \(1\) 就行了。具体是 f[j][read(x)]++。其中 \(x\) 只是用来读入临时数据的变量。
然后读入正确答案时只需判断是否正确,累加即可。
判断时判断预测答案是 \(\checkmark\) 还是 \(\times\) 时,只需要把表达式 f[i][0]<f[i][1] 写上去就行了,若 \(\times\) 比 \(\checkmark\) 少,则返回 \(0\),也就是 \(\times\)。反之,返回 \(\checkmark\)。只是想省几个if。
代码
#include <iostream>
using namespace std;
template<typename T=int>
inline T read(){
T X=0; bool flag=1; char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-') flag=0; ch=getchar();}
while(ch>='0' && ch<='9') X=(X<<1)+(X<<3)+ch-'0',ch=getchar();
if(flag) return X;
return ~(X-1);
}
template<typename T=int>
inline void write(T X){
if(X<0) putchar('-'),X=~(X-1);
T s[20],top=0;
while(X) s[++top]=X%10,X/=10;
if(!top) s[++top]=0;
while(top) putchar(s[top--]+'0');
putchar('\n');
}
const int N=1e3+5;
int n,m,ans;
int f[N][2];
int main(){
n=read(),m=read();
for(int i=1; i<=m; i++)
for(int j=1; j<=n; j++)
f[j][read()]++;
for(int i=1; i<=n; i++)
if(read()==f[i][0]<f[i][1])
ans++;
write(ans);
return 0;
}

浙公网安备 33010602011771号