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

题目链接:[NOI Online 2022 入门组] 王国比赛 - 洛谷

题目描述

智慧之王 Kri 统治着一座王国。

这天 Kri 决定举行一场比赛,来检验自己大臣的智慧。

比赛由 nn 道判断题组成,有 mm 位大臣参加。现在你已经知道了所有大臣的答题情况,但尚未拿到答案,于是你决定先行预测。

具体来说,对于第 ii 道题,有 xx 个大臣选对,yy 个大臣选错(显然有 x+y=mx+y=m),如果 x>yx>y,那么你预测这题答案为对,否则为错。为了方便,我们保证 mm 是奇数。

在统计完成后,你拿到了答案,你想知道通过你的预测方式你最后有几道题预测正确。

输入格式

第一行两个正整数 n,mn,m,保证 mm 是奇数。

接下来 mm 行,每行 nn 个整数,第 ii 行第 jj 个整数代表第 ii 位大臣对第 jj 道题的答案,11 表示他选对,00 表示他选错。

接下来 11 行 nn 个整数, 表示比赛答案,第 ii 个数 b_ibi​ 若为 11 表示第 ii 道题答案是对,若为 00 表示答案是错。

输出格式

输出一个整数,表示你最后有几题预测正确。

输入输出样例

输入 #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=2x=1,y=2 你预测答案为错(即 00),实际答案为1,预测错误。
  • 第二题 x=2,y=1x=2,y=1 你预测答案为对(即 11),实际答案为1,预测正确。
  • 第三题 x=2,y=1x=2,y=1 你预测答案为对(即 11),实际答案为1,预测正确。

所以预测正确的题数为 22。

【数据范围】

对于 20\%20% 的数据,n\le 5n≤5,m=1m=1。

对于 50\%50% 的数据,n\le 10n≤10,m\le 10m≤10。

对于 100\%100% 的数据,1 \le n\le 10001≤n≤1000,1 \le m\le 10001≤m≤1000,mm 为奇数。

附件下载

kingdom.zip2.91KB

这是一道模拟题。

先输入,查看每一位大臣的答案,如果答对的人数大于答错的人数,我们就预测这一题为正确的,否则预测为错误的。

全部的题都预测完后,将预测的答案和标准的答案比较,如果相同计数器就自加,最后输出。

比赛时暴力写了个40分代码:

#include<bits/stdc++.h>
using namespace std;
int a[1000005];
int b[1005];
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m*n;i++)
	{
		cin>>a[i];
	}
	int z=0;
	for(int i=1;i<=n;i++)
	{
		int l=1+i;
	    int x=0,y=0;
	    if(a[l]==1)x++;
	    else y++;
		for(int j=1;j<=m-1;j++)
		{
			l=l+n;
		    if(a[l]==1)
	        {
		        x++;
	        }else{
		        y++;
	        }
		}
		z=z+1;
		if(x>y)
		{
			b[z]=1;
		}
		else
		{
			b[z]=0;
		 } 
	}
	int c;
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		cin>>c;
		if(b[i]==c)ans++;
	}
	cout<<ans<<endl;
	return 0;
}

优化后的AC代码如下:

#include <bits/stdc++.h>
using namespace std;
int n, m, s, yu[1007], x, p, q, a[1007][1007];
int main()
{
	scanf("%d%d", &n, &m);
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			scanf("%d", &a[i][j]);
		}
	}
	for(int j=1;j<=n;j++){
		p=q=0;
		for (int i=1; i<=m; i++){
			if (a[i][j] == 0) p ++;
			if (a[i][j] == 1) q ++;
		}
		if (p > q) yu[j]=0;
		else yu[j]=1;
	}
	for (int i=1; i<=n; i++){
		scanf ("%d", &x);
		if (x == yu[i]) s ++;
	}
	printf ("%d\n", s);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值