题目背景:
经过管理员的考虑,我们打算将民间数据单独存放在最后一个 Subtask 中。这些测试点分数均为 0 分,但是没有通过其中的任何测试点将会视为此题不通过。
民间数据提供者:@一扶苏一。
题目描述:
智慧之王 Kri 统治着一座王国。
这天 Kri 决定举行一场比赛,来检验自己大臣的智慧。
比赛由 n 道判断题组成,有 m 位大臣参加。现在你已经知道了所有大臣的答题情况,但尚未拿到答案,于是你决定先行预测。
具体来说,对于第 i 道题,有 x 个大臣选对,y 个大臣选错(显然有 x+y=m),如果 x>y,那么你预测这题答案为对,否则为错。为了方便,我们保证 m 是奇数。
在统计完成后,你拿到了答案,你想知道通过你的预测方式你最后有几道题预测正确。
输入格式:
第一行两个正整数 n,m,保证 m 是奇数。
接下来 m 行,每行 n 个整数,第 i 行第 j 个整数代表第 i 位大臣对第 j 道题的答案,1 表示他选对,0 表示他选错。
接下来 1 行 n 个整数, 表示比赛答案,第 i 个数 bi 若为 1 表示第 i 道题答案是对,若为 0 表示答案是错。
输出格式:
输出一个整数,表示你最后有几题预测正确。
输入输出样例:
输入 #1:
3 3 1 0 1 0 1 1 0 1 0 1 1 1
输出 #1:
2
输入 #2:
6 5 1 0 1 1 1 0 0 1 0 1 1 1 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0
输出 #2:
4
输入 #3:
见附件中的 kingdom3.in
输出 #3:
见附件中的 kingdom3.out
说明/提示
【样例 1 解释】
- 第一题 x=1,y=2 你预测答案为错(即 0),实际答案为1,预测错误。
- 第二题 x=2,y=1 你预测答案为对(即 1),实际答案为1,预测正确。
- 第三题 x=2,y=1 你预测答案为对(即 1),实际答案为1,预测正确。
所以预测正确的题数为 2。
【数据范围】
对于 20% 的数据,n≤5,m=1。
对于 50% 的数据,n≤10,m≤10。
对于 100% 的数据,1≤n≤1000,1≤m≤1000,m 为奇数。
附件下载:
2.91KB
kingdom.ziphttps://www.luogu.com.cn/fe/api/problem/downloadAttachment/kwmh4jp9
题目大意:
比赛由 n 道判断题组成,有 m 位大臣参加。
对于第 i 道题,有 x 个大臣选对,y 个大臣选错,如果 x>y ,那么你预测这题答案为对,否则为错。 在统计完成后,你拿到了答案,通过这样预测方式最后有几道题预测正确。
思路:
这道题有一个坑:
- 题目中为 n 题 m 人,可是输入数据是 m 行 n 列。
还不理解?看看这个样例就知道了:
3 3
1 0 1
0 1 1
0 1 0
1 1 1
以正常的想法,应该是 1 0 1
,0 1 1
,0 1 0
这三个数据为一题大臣的判断,可是由于是 n 行 m 列,导致了你需要“竖”着看,即 1 0 0
,0 1 1
,1 1 0
为三道题的判断。
新手容易上当(包括我都蒙了一会)。
好了,说正题。
其实思路并不难想。首先根据题意和数据范围我们就可以知道,这是一道简单的模拟题,然后根据题意模拟即可:先输入(要注意 nn 和 mm 的顺序),然后对于每一道题,查看每一位大臣的答案,如果答对的人数大于答错的人数,我们就预测这一题为正确的,否则预测为错误的。全部的题都预测完后,将预测的答案和标准的答案比较,如果相同计数器就加一,最后输出即可。
代码:
#include<bits/stdc++.h> //万能头文件
using namespace std; //批准使用std类
int main(){ //main主函数
int n,m,sum=0; //定义题目数量,大臣数量,计数器
cin>>n>>m; //输入
int a[m][n],z[n]; //定义
for(int i=0;i<m;i++) //循环输入
for(int j=0;j<n;j++) //循环输入
cin>>a[i][j]; //输入答案
for(int i=0;i<n;i++) //循环输入
cin>>z[i]; //输入每道题的正确答案
for(int i=0;i<n;i++){ //跟正确答案进行比较
int x=0,y=0; //定义这道题大臣选对的数量x,选错的数量y.
for(int j=0;j<m;j++){ //看每位大臣的答案
if(a[j][i]==1) //如果为1
x++; //计数器x++
else //不是1为0
y++; //计数器y++
}
if(x>y){ //如果x的数量大于y(那么他们认为选1是对的)
if(z[i]==1) //看一下正确答案是否为1
sum++; //猜对了,计数器sum++
}
else{ //如果x的数量小于y(那么他们认为选0是对的)
if(z[i]==0) //看一下正确答案是否为0
sum++; //才对了,计数器sum++
}
}
cout<<sum<<endl; //输出猜对的数量
return 0; //结束
}
总结:
这道题还算比较简单,作为去年NOI Online的第一题还是可以的。
题目链接:
[NOI Online 2022 入门组] 王国比赛 - 洛谷https://www.luogu.com.cn/problem/P8254