这题第一反应用map,键存输入,值记出现次数
但是既然分在了DP里,说明它有DP做法
查了一下以后发现代码很巧妙
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 99999
using namespace std;
int main()
{
int n,num,ans,cnt;
while(~scanf("%d",&n)){
cnt = 0;
for(int i=0; i<n; i++)
{
scanf("%d", &num);
if(cnt==0)
{
ans = num;
cnt++;
}
else
{
if(num==ans)
cnt++;
else
cnt--;
}
}
printf("%d\n", ans);
}
}
一开始没看懂
输出了一下这个cnt
得到如下
这段代码的意思应该是
先假设第一个数值是答案
如果下一个数值跟它相同则cnt++
如果不同cnt--
当cnt再次归零时,由于之前假设的数值出现的次数已经不足以满足>(n+1)/2,故重新假设下一数值为答案
由于答案出现的次数一定大于其他数值出现次数,故最终cnt不为0时,其假设就是答案