題意:傳送門
題解:怎麼能產生矛盾,那就是正好相差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 輸出格式 乙個整數...