码迷,mamicode.com
首页 > 其他好文 > 详细

活动投票

时间:2020-07-11 13:11:10      阅读:45      评论:0      收藏:0      [点我收藏+]

标签:ret   for   line   复杂   其他   出现   答案   次数   c++   

活动投票( 思维题\(\star?\))

  • 时限:\(0.5s\) 内存:\(2M\)

Descrption

  • 衡中活动很多,人也很多,一次活动有 \(n\) 个学生参与投票,现已知一名参赛选手票数超过半数,求其参赛号\(a_i\)(参赛号随机,\(0\le a_i \le 2147483647\)) 。

Input

  • 第一行一个整数 \(n\)
  • 第二行 \(n\) 个整数 \(N_i\) 代表第 \(i\) 个学生所投选手的参赛号。

Output

  • 超过半数选手的参赛号。

Sample Input

10
5 1 2 5 5 2 3 5 5 5

Sample Output

5

Hint

  • \(100\%\) 的数据满足:\(n ≤3000000\)
  • 来源:\(20180718\)

分析

  • 我们要求的数 \(x\) 的出现次数一定是比其他任何数的出现次数多,那么我们把所有的不同的数之间相互配对,剩下的数就一定是我们要求的
    • \(3, 1, 4 ,5, 1, 1, 1, 5, 1, 1, 1, 1->(1,3)(1,4)(1,5)(1,5),1,1,1,1\)
  • 具体实现时采用按序消除的方法
    • 每次碰到一个数,如果它和上一个数不同,就把它和上一个数配对并消掉
    • 如果它和上一个数相同,就个数加一
    • 最后剩下的数就是答案。
  • 空间复杂度为:\(O(1)\),时间复杂度为 \(O(n)\)

Code

#include <bits/stdc++.h>
const int maxn=100+5,Inf=0x3f3f3f3f;

void Solve(){
    int cnt=0,ans,n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        int x;scanf("%d",&x);
        if(cnt==0)//全抵消了那暂定为答案
            ans=x,cnt++;
        else
            if(x!=ans) --cnt;//不相同就抵消一对
            else ++cnt;//相同的个数加一
    }
    printf("%d\n",ans);
}
int main() {
    Solve();
    return 0;
}

活动投票

标签:ret   for   line   复杂   其他   出现   答案   次数   c++   

原文地址:https://www.cnblogs.com/hbhszxyb/p/13283003.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!