[NOI Online 2022 入门组] 王国比赛

题目背景:

经过管理员的考虑,我们打算将民间数据单独存放在最后一个 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.zipicon-default.png?t=N0U7https://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 10 1 10 1 0 这三个数据为一题大臣的判断,可是由于是 n 行 m 列,导致了你需要“竖”着看,即 1 0 00 1 11 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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙星尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值