這題第一反應用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時,其假設就是答案