题目描述

摸鱼村要选村长了!

选村长的规则是村里每个人进行一次投票,票数大于人数一半的成为村长。

然鹅摸鱼村的人都比较懒,你能帮他们写一个程序来找出谁当选村长吗?

(每名村民的编号都是一个int范围内的整数)

输入

多行,每行一个数字(int范围内)

输出

输出出现次数超过总数一半的数字。(保证一定有解)

输入样例

1
1
12345678
2
1

输出样例

1

题目链接:https://buaacoding.cn/problem/1897/index

题目概要:多行数据(具体几行未知),从中选出超过半数的数据。(保证这个数据一定存在)

题目分析:

  • 本题由于数据未知,而且数据量很大,所以试图开十分大的数组来卡数据的方式不是出题人的本意,因此需要找到一种“巧妙”的算法来实现
  • 本题的重点在于找出超过半数的数据,请注意:不是出现次数最多的数据!当然,本题中出现次数最多的一定是超过半数的数据,但如果对别的题来说,只是要找到出现次数最多的数据,那么下面这种算法就无法实现了。
  • 正如上面所分析:出现超过半数的数据,意味着其他所有数据出现的次数加起来也不如他多!
  • 下面介绍两种非常巧妙的思路

思路一:

借助计算机中每个数的存储都是二进制的形式,int为32位整数,每位只有两种情况,即0或者1。因此,出现次数超过半数的数据对应的二进制位上的0和1一定是最多的。(可能说起来仍然不好表述,看到代码一定能懂)

#include<stdio.h>
int main()
{
int cnt[][] = {};
// int 32位数每位对应的数字
// cnt[i][0] 表示第i位为0; cnt[i][1] 表示第i位为1;
int a, ans = , i;
while(scanf("%d",&a)!=EOF){
for(i = ; i < ; i++)
if(&(a>>i))
cnt[i][]++;
else
cnt[i][]++;
}
for(i = ; i < ; i++)
// 判断超过半数的数据第i位的数字
if(cnt[i][] > cnt[i][])
ans|=(<<i);
printf("%d",ans);
return ;
}
#include<stdio.h>
int main(){
int cnt[][] = {};
int i, temp;
while(~scanf("%d", &temp)){
for(i = ; i < ; i++){
if(temp & )
cnt[i][]++;
else
cnt[i][]++;
temp = temp >> ;
}
}
int ans = ;
for(i = ; i >= ; i--)
if(cnt[i][] > cnt[i][])
ans = (ans << ) + ;
else
ans = ans << ;
printf("%d", ans);
return ;
}

其思路之精巧令人咋舌!

思路二:

最坏的情况就是出现次数最多的数据和其他数据都抵消了,最后仍能剩下它这组数据。

正常情况可能存在其他数据之间也相互抵消的情况,那么最后更是只剩下这组数据了。

#include<stdio.h>
int main() {
int cnt = , n, x;
while(~scanf("%d", &x)) {
if(cnt == )
// 全部抵消完成(回到最初的起点
n = x;
if(x == n) {
cnt++;
} else {
cnt--;
}
}
printf("%d", n);
return ;
}

其思路之精巧令人咋舌!

思路三:

朴素做法,虽然不是本题出题人本意,但利用数组保存数据也不失为一种思路。

(附:本学期做C语言助教,老师告诉我,将此题应用到实际生活中,宁肯多开空间,也不能丢失选票)

#include <stdio.h>
#include <stdlib.h> int a[]; int comp_int(const void *a, const void *b)
{
return *(int *)a-*(int *)b;
} int main()
{
int cnt = ;
while (scanf("%d", &a[cnt]) != EOF)
{
cnt++;
}
cnt--;
qsort(a+, cnt, sizeof(int), comp_int);
  // 排序,排序完成后中间的数据一定是出现次数过半的数据
printf("%d", a[cnt / ]);
return ;
}

最新文章

  1. Css--深入学习之三角形气泡窗
  2. wordpress的备份与还原
  3. MyEclipse使用总结——在MyEclipse中设置jsp页面为默认utf-8编码
  4. Sass中的mixin,function,extend
  5. MySQL(5):数据表操作
  6. eclise -The method onClick(View) of type new View.OnClickListener(){} must override a superclass method
  7. HDU3564 --- Another LIS (线段树维护最值问题)
  8. [Windows Phone] 以多国语言做为开发前提 (1)
  9. 对web.config的ConnectionString加密
  10. bzoj 3528: [Zjoi2014]星系调查
  11. java基础只关键字final
  12. 衡量android开发者水平的面试问题-android学习之旅(91)
  13. H3C IRF MAD检测原理及相关问题验证
  14. [UE4]GameMode和GameInstance
  15. HGOI20180823 三校联考
  16. C语言中头文件&mdash;&mdash;你乱吗????
  17. vue组件--TagsInput
  18. UVALive 5058 Counting BST 数学
  19. android4.0 锁屏实现(转)
  20. JCenter下载太慢?教你修改Maven仓库地址为国内镜像

热门文章

  1. Django框架详细介绍---认证系统
  2. React脚手架create-react-app
  3. Java-线程间通信小结
  4. linux单项目发布流程
  5. 当namenode启动不了时
  6. semaphore demo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
  7. flutter sqflite
  8. MySQL触发器在建立时,报语法错的问题
  9. CefSharp浏览器网页中文语言设置
  10. [darknet]查看错误结果 sight of wrong