#LQ1073. 评选最佳品牌

题目描述

nn 个评委投票,在 mm 个商品中评选一个最佳品牌。评选采用多轮淘汰制,即:每轮投票,淘汰掉得票最少的候选品牌(得票并列最少的品牌一起淘汰)。如此一轮轮淘汰下去,如果最后只剩下一个品牌当选,即告评选成功。但如果在某轮投票中,当时未被淘汰的所有候选品牌(大于等于两个品牌)都并列得票最少,即告评选失败。\\如果评选成功就输出当选品牌号。否则输出最后一轮评选时唯一选票数的相反数。\\\\在评选流程中,每个评委的态度都可用一个序列来表示;例如当 m=5m=5 时,某评委的 评选态度序列为:33、55、11、22、44,则表示该评委:优先投 33 号,当 33 号被淘汰时投 55 号,当 33 和 55 都被淘汰时投 11,当 33、55、11 都被淘汰时投 22,仅剩 44 号时才投 44 号品牌的票。选票的序列中可以表示弃权,用 00 来表示,例如当 m=5m=5 时,某评委的评选态度序列为:33、55、00,则表示该评委:优先投 33 号,当 33 号被淘汰时投 55 号,其它情况下不投任何品牌的票。\\\\编程实现:\\请你编一个程序,模拟各轮投票的过程,得到评选结果。

输入格式

第一行两个整数mm和nn,用空格隔开。mm表示参加评选的品牌数和 nn表示参加投票的评委数;\\接下来的 nn 行:每行都是长度不超 mm 的数字字符串,每个字符串表示一个评委的评选态度。

输出格式

一个整数,表示最后评选结果。

输入数据 1

3 4
123
213
132
10

Copy

输出数据 1

1

Copy

输入数据 2

3 4
321
213
231
312

Copy

输出数据 2

-2

Copy

数据1说明

第一行 33 44 代表 33 个品牌,44 个评委\\第一轮投票,33 个评委优先选择 11 号品牌,11 个评委选择 22 号品牌,品牌 33 得票最少, 淘汰掉;\\第二轮投票,33 个评委优先选择 11 号品牌,11 个评委选择 22 号品牌,品牌 22 得票最少, 淘汰掉。\\只剩一个1号品牌胜出。

数据2说明

第一行 33 44 代表 33 个品牌,44 个评委\\第一轮投票,22 个评委选择 22 号品牌,22 个评委选择 33 号品牌,11 号得票最少,淘汰掉;\\第二轮投票,22 个评委选择 22 号品牌,22 个评委选择 33 号品牌,由于只剩下两个品牌, 且并列最少,都是 22 票,代表评选失败,需要输出最后一轮票数 22 的相反数-2−2;最终结果 -2−2。

数据规模与约定

对于 100\%100% 的数据,0\lt m \lt 100<m<10,1\lt n \lt 10001<n<1000。

代码如下:

#include<iostream>
#include<cstring>
using namespace std;
string s[1000];
int p[10];
int out[10],tt;
int main() {
	int m,n;
	cin>>m>>n;
	for(int i=0; i<n; i++) cin>>s[i];

	for(int i=0; i<m; i++) {
		for(int j=0; j<m; j++)  p[j]=0;
		for(int j=0; j<n; j++) {
			for(int k=0; s[j][k]!='\0'; k++) {
				int x=s[j][k]-'0'-1;
				if(0<=x&&x<m&&!out[x]) {
					p[x]++;
					break;
				}
			}
		}
		
		int mi=n;
		
		for(int j=0; j<m; j++)
			if(!out[j]) mi=min(p[j],mi);
		for(int j=0; j<m; j++) {
			if(!out[j]&&mi==p[j]) {
				out[j]=1;
				tt++;
				if(i<m-1&&tt==m) {
					cout<<0-p[j];
					return 0;
				}
			}
		}
		if(tt==m-1) {
			for(int j=0; j<m; j++) {
				if(out[j]==0) {
					cout<<j+1;
					return 0;
				}
			}
		}
	}
	return 0;
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值