题目描述
n 个评委投票,在 m 个商品中评选一个最佳品牌。评选采用多轮淘汰制,即:每轮投票,淘汰掉得票最少的候选品牌(得票并列最少的品牌一起淘汰)。如此一轮轮淘汰下去,如果最后只剩下一个品牌当选,即告评选成功。但如果在某轮投票中,当时未被淘汰的所有候选品牌(大于等于两个品牌)都并列得票最少,即告评选失败。如果评选成功就输出当选品牌号。否则输出最后一轮评选时唯一选票数的相反数。在评选流程中,每个评委的态度都可用一个序列来表示;例如当 m=5 时,某评委的 评选态度序列为:3、5、1、2、4,则表示该评委:优先投 3 号,当 3 号被淘汰时投 5 号,当 3和 5 都被淘汰时投 1,当 3、5、1 都被淘汰时投 2,仅剩 4 号时才投 4 号品牌的票。选票的序列中可以表示弃权,用 0 来表示,例如当m=5 时,某评委的评选态度序列为3、5、0,则表示该评委:优先投 3 号,当 3 号被淘汰时投 5 号,其它情况下不投任何品牌的票。编程实现:请你编一个程序,模拟各轮投票的过程,得到评选结果。
输入格式
第一行两个整数m和n,用空格隔开。m表示参加评选的品牌数和 n表示参加投票的评委数;接下来的 n 行:每行都是长度不超 m 的数字字符串,每个字符串表示一个评委的评选态度。
输出格式
一个整数,表示最后评选结果。
输入数据 1
3 4
123
213
132
10
Copy
输出数据 1
1
Copy
输入数据 2
3 4
321
213
231
312
Copy
输出数据 2
-2
Copy
数据1说明
第一行 3 4 代表 3 个品牌,44个评委第一轮投票,3个评委优先选择 1 号品牌,1 个评委选择 2 号品牌,品牌 3 得票最少, 淘汰掉;第二轮投票,3个评委优先选择 1 号品牌,1 个评委选择 2 号品牌,品牌 2 得票最少, 淘汰掉。只剩一个1号品牌胜出。
数据2说明
第一行 3 4 代表 3 个品牌,4 个评委第一轮投票,2 个评委选择 2 号品牌,2个评委选择 3 号品牌,1号得票最少,淘汰掉;第二轮投票,2 个评委选择 2 号品牌,2 个评委选择 3 号品牌,由于只剩下两个品牌, 且并列最少,都是 2 票,代表评选失败,需要输出最后一轮票数 2 的相反数−2;最终结果 −2。
数据规模与约定
对于 100%100% 的数据,0<m<10,1<n<1000。
本题利用函数即可高效完成,空间占用少
#include<iostream>
#include<algorithm>
#include<cstring>
#include<fstream>
using namespace std;
const int M=15,N=1010;
int g[N][M];//存储评委投票态度
int piao[M];//得票桶
int st[M];//品牌标识桶
bool success=true;
int last_piaoshu;
int last_pinpai;
int n,m;//n个评委 m个品牌
void pingxuan()
{
while(1){
memset(piao,0,sizeof(piao));
for(int i=1;i<=n;i++)
for(int j=1;j<M;j++){
int k=g[i][j];
if(k==0) break;//弃权票
if(st[k])continue;//品牌已淘汰
piao[k]++;//投票入桶
break;//投票完成换下个评委
}
//寻找最大票数和最小票数
int min=1001,max=-1001;
for(int i=1;i<M;i++){
if(piao[i]<min && !st[i])min=piao[i];
if(piao[i]>max && !st[i])max=piao[i];
}
if(max>min){//淘汰掉最小得票的品牌
for(int i=1;i<M;i++)
if(piao[i]==min && st[i]==false)st[i]=true;//标志淘汰
continue;//进入下一轮评选
}
else{
int sum=0;
for(int i=1;i<M;i++)//搜索有几个最小票数的品牌
if(piao[i]==min)sum++,last_pinpai=i;
if(sum==1)return;//只剩一个品牌,结束循环
else{//剩余多个品牌,评选失败
last_piaoshu=min;//保留最后一轮的得票
success=false;//标识失败
return ;//评选结束 退出循环
}
}
}
}
int main()//开始主体部分
{
cin>>m>>n;
for(int i=1;i<=n;i++){
string str;
cin>>str;
for(int j=0;j<str.size();j++)
g[i][j+1]=str[j]-'0';
}
pingxuan();//导入函数
if(success)
{
cout<<last_pinpai<<endl;
}
else {
cout<<"-"<<last_piaoshu<<endl;
}
return 0;
}