题意:有一个大小为n的整数数组a。最初,数组所有元素都为1.
可以执行如下操作:选定一个i和任意的x(x>0)然后把ai=ai+[ai/x](向下取整)
执行所有操作后,若ai==bi,那么你可以得到ci个金币。通过执行不超过k次的操作使得获得最大的金币数量。
1->bi的最小操作数,用广搜得到。所以用广搜预处理1->1000的所有最小操作数,然后来一遍01背包即可。
细节处理:由于k太大了,但是可以发现任意一个1->bi的操作数最多为20左右,所以最多操作数总和也不过2e4左右,所以在跑背包之前先判断一下k与总操作数的大小关系;
#include <bits/stdc++.h>
using namespace std;
const int N=1005;
int n,k;
int v[N];
int b[N];
int w[N];
int cost[N];
bool flag[N];
void solve(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++) cin>>w[i];
int sum=0;
for(int i=1;i<=n;i++){
v[i]=cost[b[i]];
sum+=v[i];
}
int ans=0;
if(sum<=k){
for(int i=1;i<=n;i++) ans+=w[i];
cout<<ans<<'\n';
}else{
static int f[1000005];
memset(f

本文介绍了一种解决关于整数数组操作获取金币问题的方法,首先通过广度优先搜索预处理最小操作次数,然后利用01背包算法优化在有限操作次数下获取最大金币数的策略。着重讨论了细节处理中如何控制操作次数和优化背包过程以应对大规模数据和限制k值的情况。
最低0.47元/天 解锁文章
9319

被折叠的 条评论
为什么被折叠?



