歷屆試題 對局匹配 劃分集合dp 貪心

2021-09-21 06:31:07 字數 1426 閱讀 7907

題意:傳送門

題解:怎麼能產生矛盾,那就是正好相差k,那就可以把這些數根據模k的餘數統一處理成k個集合,然後在每個集合上進行操作,dp[j]=max(dp[j-k],dp[j-2k]+cnt[j]),也就是這個數要麼不用,那麼直接用第j-k個,要麼使用,那麼就是j-2k,最後把劃分的集合分別累加即可。

#include

#define ll long long

using

namespace std;

const

int inf=

0x3f3f3f3f

;const

int maxn=

1e5+5;

inline

intread()

while

(ch>=

'0'&&ch<=

'9')

return x*f;

}int n,k,a[maxn]

,cnt[maxn]

,dp[maxn]

;int

main()

int sum=0;

if(k==0)

for(

int i=

0;i)else

if(j==i+k)

else

} sum+

=dp[j-k];}

printf

("%d\n"

,sum)

;return0;

}

第二種方法使用貪心

貪心選出能匹配的最大局數,最後用總人數減去能匹配的最大局數即可。匹配最大局數從小到大匹配最貪心。

#include

#define ll long long

using

namespace std;

const

int inf=

0x3f3f3f3f

;const

int maxn=

1e5+5;

inline

intread()

while

(ch>=

'0'&&ch<=

'9')

return x*f;

}int n,k,a[maxn]

,cnt[maxn]

,dp[maxn]

;int

main()

int sum=0;

if(k==0)

for(

int i=

0;i)else

if(j==i+k)

else

} sum+

=dp[j-k];}

printf

("%d\n"

,sum)

;return0;

}

歷屆試題 對局匹配 (dp)

問題描述 輸入格式 第一行包含兩個個整數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 樣例輸...

歷屆試題 對局匹配

這幾天心態有點崩,不會的忒多了,翻翻學長們的部落格,同時期的他們學的演算法比我多,題量也是!而且我很多學的演算法和資料結構都只是做過模板題。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 輸出格式 乙個整數...