菜鸡学C语言之摸鱼村村长
题目描述
摸鱼村要选村长了!
选村长的规则是村里每个人进行一次投票,票数大于人数一半的成为村长。
然鹅摸鱼村的人都比较懒,你能帮他们写一个程序来找出谁当选村长吗?
(每名村民的编号都是一个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 ;
}
菜鸡学C语言之摸鱼村村长的更多相关文章
- 菜鸡学C语言之真心话大冒险
题目描述 Leslie非常喜欢真心话大冒险的游戏.这一次游戏的规则有些不同.每个人都有自己的真心话,一开始每个人也都只知道自己的真心话.每一轮每个人都告诉指定的一个人他所知道的所有真心话,那么Lesl ...
- 菜鸡学C语言之寻根溯源
题目描述 Mogg最近翻了翻自己家的族谱,想康康祖先是谁.但是族谱因为年久失修太乱了,他现在只整理出来了一系列父子关系,你能帮他找一找直系亲属中辈分最大的一位吗?(即父亲的父亲的父亲……) 输入 第1 ...
- 我是先学C语言还是先学C++,实不相瞒,鱼和熊掌可兼得!
这是最近一周时间几个读者小伙伴所提的问题,我顺手截了两个图. 实不相瞒,这类问题之前也经常看到. 每次遇到这种问题,看起来很简单,但是打字一时半会还真说不清,想想今天周末了,写一篇文章来统一聊 ...
- 菜鸡谈OO 第二单元总结
“欢迎来到(玄学)多线程的新世界” Homework1 单部傻瓜电梯调度 Part1 多线程设计策略 第一次学到了线程这个概念,与之前的编程体验大有不同.最大的区别在于从原本的线性发生程序变成了多个行 ...
- 菜鸡谈OO 第一单元总结
“OOP永远是我的好朋友爸爸!” ——来自某无能狂怒的菜鸡 身处在OO的第一个摸鱼黄金周中的我,感觉到了巨大的满足感.如果写博客这种充满意义的事情可以代替我们亲爱的作业,那么我提议每周来两个:)下面开 ...
- ACM菜鸡退役帖——ACM究竟给了我什么?
这个ACM退役帖,诸多原因(一言难尽...),终于决定在我大三下学期开始的时候写出来.下面说两个重要的原因. 其一是觉得菜鸡的ACM之旅没人会看的,但是新学期开始了,总结一下,只为了更好的出发吧. 其 ...
- HDU 2064 菜鸡第一次写博客
果然集训就是学长学姐天天传授水铜的动态规划和搜索,今天讲DP由于困意加上面瘫学长"听不懂就是你不行"的呵呵传授,全程梦游.最后面对连入门都算不上的几道动态规划,我的内心一片宁静,甚 ...
- 一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记
一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记 曾经某个下午我以为我会了FWT,结果现在一丁点也想不起来了--看来"学"完新东西不经常做题不写博客,就白学了 = = 我没啥智 ...
- HNOI2018 摸鱼记
HNOI2018 摸鱼记 今天我又来记流水账啦 Day 0 颓废的一天. 我,球爷和杜教在颓膜膜.io ych看起来在搓碧蓝 鬼知道哥达鸭干了什么 学习氛围只局限在机房的一角 后来全体Oier开会,5 ...
随机推荐
- 利用Openssh后门 劫持root密码
Linux操作系统的密码较难获取.而很多Linux服务器都配置了Openssh服务,在获取root权限的情况下, 可以通过修改或者更新OpenSSH代码等方法,截取并保存其SSH登录账号密码,甚至可以 ...
- linux 基本原则和常用命令
Linux的基本原则:1.由目的单一的小程序组成,组合小程序完成复杂的功能:2.一切皆文件:3.尽量避免捕获用户接口:4.配置文件保存为纯文本格式. CLI接口的命令提示符:#(root)$(普通用户 ...
- Spring boot 源码分析(一)SpringApplication.run(上)
SpringApplication.run(Main.class, args); 从这个方法开始讲吧: public static ConfigurableApplicationContext run ...
- 怎么批量删除qq空间说说
1.打开自己的QQ空间 - 说说——右击说说审查元素,打开审查元素.或者直接按f12也可以. 2.在这里我们看到很多分类 3.点击 Console,进入Console项 4.粘贴删除说说的代码,代码为 ...
- java面向对象总结(二)
Java 封装 实现Java封装的步骤 java面向对象值继承 概念: 继承的格式: 类和类之间的关系: 继承的特点: 继承的优缺点 继承的好处: 继承的缺点: 继承的注意事项: 使用继承的步骤: J ...
- opencv学习之路(38)、Mat像素统计基础——均值,标准差,协方差;特征值,特征向量
本文部分内容转自 https://www.cnblogs.com/chaosimple/p/3182157.html 一.统计学概念 二.为什么需要协方差 三.协方差矩阵 注:上述协方差矩阵还需要除以 ...
- Bresenham算法
1 算法原理 基本原理从某处摘得:设直线方程为yi+1=yi+k(xi+1-xi)+k.假设列坐标象素已经确定为xi,其行坐标为yi.那么下一个象素的列坐标为xi+1,而行坐标要么为yi,要么递增1为 ...
- iP私网地址
私网地址范围:A类10.0.0.0~255.255.255 B类172.16.0.0~172.31.255.255 C类192.168.0.0~192.168.255.255
- django url 反响解析,视图
1. 内容回顾 1. 模板语言(字符串替换) 1. 母版和继承 1. 什么时候用母版? html页面有重复的代码,把它们提取出来放到一个单独的html文件. (比如:导航条和左侧菜单) 2. 子页面如 ...
- 洛谷 P5019 铺设道路
题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...