标签:tput 情况 time next ase size 假设 lines out
InputThe input contains several test cases. Each test case contains two lines. The first line consists of an odd integer N(1<=N<=999999) which indicate the number of the integers feng5166 will tell our hero. The second line contains the N integers. The input is terminated by the end of file.
OutputFor each test case, you have to output only one line which contains the special number you have found.
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+1)/2次,找出这个数。
因为要求的这个数一定大于这个数列个数的一半,所以不妨假设拿每次都取这个数和其他的数一换一,最终剩下的还是这个数。最坏情况是这个出现次数最多的数出现了(n+1)/2次,经过了(n-1)/2次相消后剩下一个这个数,其他情况例如拿其他的不同的数相消,最后剩下的数也一定是出现次数最多的数且剩下的数量大于1。代码也就呼之欲出了。
#include <bits/stdc++.h> using namespace std; int n; int main() { while(scanf("%d",&n)!=EOF) { int i; int num=-1;//存储出现次数最多的数 int cnt=0;//num出现的次数, int pre;//之前的数 for(i=1;i<=n;i++) { int temp; scanf("%d",&temp); if(i==1) { num=temp; pre=temp; cnt++; continue; } if(temp==pre)cnt++;//输入的数与pre相同时 累计次数++ else { if(pre==-1)//重置 { num=temp; pre=temp; cnt=1; continue; } cnt--;//没有两两抵消掉且当前输入数与pre不同,累计次数-- if(cnt==0)pre=-1;//如果之前所有数都两两抵消掉了,即累计次数为0,就重置 } } cout<<num<<endl; } }
标签:tput 情况 time next ase size 假设 lines out
原文地址:https://www.cnblogs.com/lipoicyclic/p/12251848.html