歷屆試題 對局匹配 (dp)

2022-01-12 20:19:01 字數 1416 閱讀 3932

問題描述

輸入格式

第一行包含兩個個整數n和k。

第二行包含n個整數a1, a2, ... an。

對於30%的資料,1 <= n <= 10

對於100%的資料,1 <= n <= 100000, 0 <= ai <= 100000, 0 <= k <= 100000

輸出格式

乙個整數,代表答案。

樣例輸入

10 0

1 4 2 8 5 7 1 4 2 8

樣例輸出

6解題過程:

據說是貪心的題目,可惜死都看不懂,只好看看大眾的dp。

統計各個積分的人數,存在cnt陣列裡,下標為分數,元素內容為人數。相差k分的人分為一組,一組人dp一次,求一組人的最大值,累加各組dp值。

比如:k=3

分數為0  3  6  9  12的人為一組

分數為1  4  7  10 13的人為一組

通過取和不取該分數的人數來找到最大值。

假設到了6這個分數,取6這個分數的人,就不能取分數為3的人,但是能取分數為0的人數。

dp[6]=max(dp[0]+cnt[6],dp[3])

假設到了3這個分數,取3這個分數的人,就不能取分數為0的人,但是沒有分數比0更低的dp值,改變dp式子。

dp[3]=max(cnt[3],dp[0])

假設到了0這個分數,顯然取是最大的情況,則dp式為:

dp[0]=cnt[0]

另外,對於k=0分情況討論即可,每種分數取乙個人,就匹配不了。

1 #include2 #include3 #include4 #include5 #include6 #include

7 #include8 #include9

#define ll long long

10using

namespace

std;

1112

intn,k,x;

13int dp[200005];///

開這麼大,防止k巨大,陣列越界

14int cnt[100005

];15

16int

main()

1727

if(k)

28for(int i=0;i///

i對應分組 0到k-1這k個分組

2940 ans+=dp[j-k];///

跳出迴圈的j超過maxx了41}

42else

43for(int i=0;i<=maxx;i++)

44if

(cnt[i])

45 ans++;

46 printf("

%d\n

",ans);

47return0;

48 }

歷屆試題 對局匹配

這幾天心態有點崩,不會的忒多了,翻翻學長們的部落格,同時期的他們學的演算法比我多,題量也是!而且我很多學的演算法和資料結構都只是做過模板題。md下學期逃課吧,我愛acm!萬幸今天下午查機組考得還算可以hhhh,算是一件值得高興的事呢。如果對於給定的k為0,那麼我們讓每乙個積分為x的組的人數都只剩乙個...

歷屆試題 對局匹配

提交此題 評測記錄 資源限制 時間限制 1.0s 記憶體限制 256.0mb 問題描述 輸入格式 第一行包含兩個個整數n和k。第二行包含n個整數a1,a2,an。對於30 的資料,1 n 10 對於100 的資料,1 n 100000,0 ai 100000,0 k 100000 輸出格式 乙個整數...

試題 歷屆試題 對局匹配

小明發現 的自動對局系統在匹配對手時,只會將積分差恰好是k的兩名使用者匹配在一起。如果兩人分差小於或大於k,系統都不會將他們匹配。現在小明知道這個 總共有n名使用者,以及他們的積分分別是a1,a2,an。include include using namespace std const int ma...