这题目我直接用map暴力膜过的
然后看到kuangbin的做法,总结一下
/* 多元素即在数列中出现次数多于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;//cnt保存的是result出现的个数 for(i=0;i<n;i++) { scanf("%d",&t); if(cnt==0)//如果这个数被删完了那么我们就把下一个读进来的数当做result { cnt=1; result=t; } else { if(t==result)cnt++; else cnt--;//这个其实是删去的操作,如果两个数不同,我把两个数都删去 } } printf("%d\n",result); } return 0; }