思路:
- 暴力:存储所有数字,sort,其中位数一定是答案。
- 动态规划:取消数组,维护两个变量 cur 和 num。新读入的数如果是 cur,num++;如不是 cur,则 num- -。因为目标出现次数超过一半,所以当目标数全都在一起时,最后也有 num>0;在分散最开的情况下,两两抵消,最后三个数中出现两次的即为答案。故做法成立。
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e6 + 5;
int N;
int num[maxn];
int main(){
while(~scanf("%d" , &N)){
for(int i=0;i<N;i++)
scanf("%d" , num + i);
sort(num , num+N);
printf("%d\n" , num[(N+1)/2]);
}
return 0;
}
#include <iostream>
using namespace std;
int main(){
int N;
int cur;
int num;
while(~scanf("%d" , &N)){
num = 0;
int t;
while(N--){
scanf("%d" , &t);
if(!num){
cur = t;
num++;
}
else{
if(cur == t)
num++;
else
num--;
}
}
printf("%d\n" , cur);
}
return 0;
}