思路是先从1到n计算一遍每个数进行A操作的代价,然后从1到n如果在P里面,选择每个进行a操作和b操作的达到目标的最小值
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e6;
int a[maxn],b[maxn],c[maxn];
bool v[maxn],p[maxn];
int add[maxn],ans[maxn];
void kread(int &x){
int f=1;
x=0;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x*=10;x+=c-'0';c=getchar();}
x*=f;
}
signed main(){
int n;
kread(n);
for(int i=1;i<=n;i++){
kread(a[i]);
}
for(int i=1;i<=n;i++){
kread(b[i]);
}
for(int i=1;i<=n;i++){
kread(c[i]);
}
int q;
kread(q);
while(q--){
int m;
kread(m);
memset(v,1,sizeof(v));
memset(p,0,sizeof(v));
memset(ans,0,sizeof(ans));
for(int i=1;i<=m;i++){
int o;
kread(o);
p[o]=1;
}
add[1]=0;
if(p[1]==1){
add[1]=c[1];
}
for(int i=2;i<=n;i++){
add[i]=add[i-1];
if(p[i]==1){
add[i]+=c[i];
}
}
if(p[1]==0){
ans[1]=min(a[1],b[1]);
}
for(int i=2;i<=n;i++){
if(p[i]==1){
ans[i]=ans[i-1];
}
else{
ans[i]=min(ans[i-1]+b[i],add[i]+a[i]);
}
}
cout<<ans[n]<<"\n";
}
return 0;
}
各位大佬帮帮 评测记录