藍橋杯對局匹配及動態規劃

2021-10-09 18:41:11 字數 1172 閱讀 7576

在這道題目中,我們就需要運用到動態規劃的知識。

在我們學習動態規劃前我們或許會用bfs,dfs,遞迴來寫這道題,但是,我們不難發現當我們使用前面三個演算法的時候,我們的時間複雜度會很高。是n^n次方,當n是乙個較大的值的時候,我們必然會超時,其中的原因很大是因為我們出現了重疊子問題的現象。而動態規劃就能很好的規避這個問題

(動態規劃入門傳送門:

思路

動態規劃主要是來對問題的拆分,使其變成若干的子問題,再通過若干子問題的解決來實現對最初問題的解決,所以我們首先需要考慮的是對於問題的拆分,即我們如何講我們所需要的問題拆分成若干子問題,並且將著若干子問題都使用狀態轉移方程式來實現鏈結。

在對局匹配中分數差值k是乙個關鍵資訊,在差值不為k的時候系統將不會進行匹配,所以可以將狀態轉移公式的變數定為k。

我們容易知道,當我所有的數值<=k的時候,我們可以將我們所擁有的積分資訊進行以k為等差的分類,我們將其分為n組,在這n組中,每一組的首元素都不超過k的值(因為當我們的陣列值的首元素超過了k的時候,便會出現重複的情況)。

當我們將其分為了n個陣列之後,我們可以容易的知道,每乙個的分組都不會於其他分組的匹配到一起,所以我們的思路就轉變為單獨求每一組的最大不能匹配數,然後將每一組的單獨最大不能匹配數相加就是我們的答案。

**

#include

#include

#include

#include

using

namespace std;

#define max_score 1000

const

int maxn=

100000+5

;int cnt[max_score+5]

,val[maxn]

,dp[maxn]

;int n,k;

intmain()

//特殊處理k=0的情況

if(k==0)

}else

//使用新的陣列dp來進行儲存

dp[0]

=val[0]

;//其值為首元素的個數

for(

int j=

1;j) ans+

=dp[m-1]

;}} cout

;}

藍橋杯 對局匹配 動態規劃

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

藍橋杯 對局匹配(動態規劃)

小明發現 的自動對局系統在匹配對手時,只會將積分差恰好是k的兩名使用者匹配在一起。如果兩人分差小於或大於k,系統都不會將他們匹配。現在小明知道這個 總共有n名使用者,以及他們的積分分別是a1,a2,an。對於30 的資料,1 n 10 對於100 的資料,1 n 100000,0 ai 100000...

對局匹配(藍橋杯)

小明發現 的自動對局系統在匹配對手時,只會將積分差恰好是k的兩名使用者匹配在一起。如果兩人分差小於或大於k,系統都不會將他們匹配。現在小明知道這個 總共有n名使用者,以及他們的積分分別是a1,a2,an。第一行包含兩個個整數n和k。第二行包含n個整數a1,a2,an。對於30 的資料,1 n 10 ...