评选最佳品牌_c++

题目描述

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;  

}

  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值