Description
Input
Output
Sample Input
5 1 3 2 3 3 11 1 1 1 1 1 5 5 5 5 5 5 7 1 1 1 1 1 1 1
Sample Output
3 5 1
题意:多元素即在数列中出现次数多于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; }
#include<iostream> #include<string.h> using namespace std; int main() { int n,num; int cnt, result; while(~scanf("%d",&n)) { cnt=0; for(int i=0;i<n;i++) { scanf("%d",&num); if(cnt==0) cnt=1,result=num; else { if(num==result)cnt++; else cnt--; } } printf("%d\n",result); } return 0; }
用map水了一发。。。
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #include<string> #include<map> #include<set> #include<ctime> #define eps 1e-6 #define MAX 100005 #define INF 0x3f3f3f3f #define LL long long #define pii pair<int,int> #define rd(x) scanf("%d",&x) #define rd2(x,y) scanf("%d%d",&x,&y) using namespace std; map<int,int>mmap; map<int,int >::iterator it; int main() { int n; int num; while(~scanf("%d",&n)) { mmap.clear(); for(int i=0;i<n;i++){ scanf("%d",&num); if(mmap.end()!=mmap.find(num)) mmap[num]++; else mmap.insert(pii(num,1)); } it=mmap.begin(); int res; for(;it!=mmap.end();it++){ if(it->second>n/2) { res=it->first; break; } } printf("%d\n",res); } return 0; }