Codeforces Round #610 (Div. 2).K for the Price of One (Hard Version)
Posted lh2000
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #610 (Div. 2).K for the Price of One (Hard Version)相关的知识,希望对你有一定的参考价值。
考虑用dp的做法,容易想到价格低的物品一定要比价格高的物品拿的优先级高,所以排序。
dp[i]表示取前i件物品需要的最少价格,当超越了价格,就不算。
转移方程为 dp[i]=min(dp[i-1]+a[i],dp[i-k]+a[i]) 表示当前物品单独买和买一送一的情况;
取最小值。
上代码
#include<bits/stdc++.h> using namespace std; int dp[200005]; int a[200005]; int main() { int t; cin>>t; while(t) { t--; int n,p,k; cin>>n>>p>>k; int ans=0; for(int i=1;i<=n;i++)cin>>a[i]; sort(a+1,a+n+1); for(int i=1;i<=n;i++) { dp[i]=dp[i-1]+a[i]; if(i>=k){ dp[i]=min(dp[i],dp[i-k]+a[i]);} if(dp[i]<=p) { ans=i; } } cout<<ans<<endl; } }
以上是关于Codeforces Round #610 (Div. 2).K for the Price of One (Hard Version)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #610 (Div. 2)E(模拟,DFS)
Codeforces Round #610 (Div. 2) a/b/c
Codeforces Round #610 (Div. 2).K for the Price of One (Hard Version)
Codeforces Round #730 (Div. 2) C. Need for Pink Slips(概率,模拟....)