ABC192F
(真的只有绿吗)
首先,很明显有,其中S代表初始魔力值,k为选择的物品数量,x为题目中给定的
然后注意到x很大,但k和n很小,所以我们可以设定状态,表示当前到第i个物品,已经选了j个,总和模k为l,这么选的初始魔法最大值(显然初始魔法越大时间花费越少),然后暴力枚举选的总数量并转移即可,时间复杂度
(oi的精髓在于枚举与模拟)
点击查看代码
void solve() {cin>>n>>x;for(int i=1;i<=n;i++) cin>>a[i];for(int k=1;k<=n;k++) {for(int i=0;i<=n+2;i++)for(int j=0;j<=n+2;j++)for(int l=0;l<=k;l++) dp[i][j][l]=0;for(int i=1;i<=n;i++) { dp[i][1][a[i]%k]=a[i];for(int j=1;j<=n;j++) for(int l=0;l<k;l++) mx(dp[i][j][l],dp[i-1][j][l],dp[i-1][j-1][(l-a[i]%k+k)%k]==0?-inf:dp[i-1][j-1][(l-a[i]%k+k)%k]+a[i]); } if(dp[n][k][x%k]) ans=min(ans,(x-dp[n][k][x%k])*1ll/k);} printf("%lld",ans);
}