hdu 1029 Ignatius and the Princess IV
2016-02-15 22:06
411 查看
题意:n个数字中找出出现次数至少为(n+1)/2的数。
方法一:
方法二:
方法一:
#include <stdio.h> #include <string.h> int A[1000000]; int main() { int n, m, i, ok; while (scanf("%d", &n) != EOF) { memset(A, 0, sizeof(A)); for (i=0; i<n; i++) { scanf("%d", &m); A[m]++; if (A[m] == (n+1)/2) ok = m; } printf("%d\n", ok); } return 0; }
方法二:
/* 多元素即在数列中出现次数多于n/2的元素 我们很容易的看出来,在一个序列中如果去掉2个不同的元素, 那么原序列中的多元素,在新的序列中还是多元素, 因此我们只要按照序列依次扫描,先把t赋值给result, 增加个计数器,cnt = 1;然后向右扫描, 如果跟result相同,则cnt++,不同,那么cnt --, 这个真是我们从上面那个结论里得出的,一旦cnt == 0了, 那么必定c不是多元素,这个时候把t赋值为result,cnt = 1;, 重复该过程,知道结束,这个时候,result就是多元素, 这个的时间复杂度为n,该题本来可以用数组保存每个元素, 然后递归上述过程,可是,用数组超内存, 因此我们可以直接按照上述过程计算 */ //用cin,cout会超时 #include<iostream> #include<string.h> using namespace std; int main() { int n,i; int t; int cnt; int result; while(scanf("%d",&n)!=EOF) { cnt=0; for(i=0;i<n;i++) { scanf("%d",&t); if(cnt==0) { cnt=1; result=t; } else { if(t==result)cnt++; else cnt--; } } printf("%d\n",result); } return 0; }
相关文章推荐
- Android杂谈之获取sdcard信息
- Match:DNA repair(POJ 3691)
- jquery 实现滚屏 轮播
- 前端,我为什么不要你
- Interop with Native Libraries
- 如何用python编写collectd的plugin
- 从头认识Spring-2.4 基于java的标准注解装配-@Inject(2)-通过set方法或者其他方法注入
- 专家精讲Oracle数据库管理与维护
- 自己搭建openfire即时通讯服务器遇到的问题
- 优化Angular应用的性能
- 写CUDA必备sublime text插件:CUDA Snippets
- 1.3 linux系统安装tomcat
- Android launcher 源码 app 的启动方式
- xUtils更新到3.0后的基本使用规则
- 160cracked-2
- Akka学习笔记(2)-ActorSystem
- NPM 与前端包管理
- 在Android Studio中的res文件夹下新建含alpha的XML文件
- HDU 1054 Strategic Game(二分图最小覆盖集)
- JavaScript 总结几个提高性能知识点