HDU 1029(DP法)

題目地址

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章