PAT-1054
2016-02-12 23:47
246 查看
title:找出超过半数的元素
1.该题求出现次数超过一半的元素,故采用moore voting算法,moore投票法
2.遇到不同的元素,如果出现次数为0,更跟换成当前元素,如果次数不为0则-1,
3.遇到相同元素,出现次数相加
4.最终记录的元素就是所求元素
map 做法:
/*
用C++读数据会超时,要用C读。
*/
#include<iostream>
#include<stdio.h>
#include<map>
using namespace std;
int main(){
int i,j,n,m,num;
map<int,int>mp;
map<int,int>::iterator it;
cin>>n>>m;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%d",&num);
mp[num]++;
}
}
for(it=mp.begin();it!=mp.end();it++){
if(it->second>(n*m/2)){
cout<<it->first<<endl;
break;
}
}
return 0;
}
1.该题求出现次数超过一半的元素,故采用moore voting算法,moore投票法
2.遇到不同的元素,如果出现次数为0,更跟换成当前元素,如果次数不为0则-1,
3.遇到相同元素,出现次数相加
4.最终记录的元素就是所求元素
//moor voting #include <iostream> #include <cstdio> using namespace std; int main() { int n,m; int tmpnum,count,num=-1; scanf("%d%d",&n,&m); for(int i=0;i<m;i++) for(int j=0;j<n;j++) { scanf("%d",&tmpnum); if(tmpnum!=num) { if(count==0) num=tmpnum; else count--; } else count++; } cout<<num<<endl; return 0; }
map 做法:
/*
用C++读数据会超时,要用C读。
*/
#include<iostream>
#include<stdio.h>
#include<map>
using namespace std;
int main(){
int i,j,n,m,num;
map<int,int>mp;
map<int,int>::iterator it;
cin>>n>>m;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%d",&num);
mp[num]++;
}
}
for(it=mp.begin();it!=mp.end();it++){
if(it->second>(n*m/2)){
cout<<it->first<<endl;
break;
}
}
return 0;
}
相关文章推荐
- socket编程 -- 基于TCP协议的C/S通信模型及实现
- Docker问题
- java正则表达式
- 1秒钟让你了解Hadoop和Spark
- 计算机视觉相关资源
- linux解压命令
- INDIGO STUDIO神器!快速创建WEB、移动应用的交互原型工具【转】
- 大数据存取的选择:行存储还是列存储?
- 浅谈12306核心模型设计思路和架构设计
- 理解Python垃圾回收机制
- GitHub入门与实践(2)掌握Git 3、更改提交操作
- 【伸展树(splay)】[JSOI2008][HYSBZ/BZOJ1014]火星人prefix
- 以创业者的姿态做一名工程师
- Leetcode 165. Compare Version Numbers
- 【UVa】[210]Concurrency Simulator
- hdu4415 Assassin's Creed
- 在腾讯的第二堂产品课——改变大河的流向 梁宁-闲花照水录
- 1025. 反转链表
- hexo&github博客搭建
- 多个Excel文件的第一个工作表(Sheet)合并到一个Excel文件的多个工作表里