『题解』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;
}
posted @ 2022-03-26 20:16  仙山有茗  阅读(239)  评论(0)    收藏  举报