社区讨论
蒟蒻求助
P9744 「KDOI-06-S」消除序列参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lo11wpw7
- 此快照首次捕获于
- 2023/10/22 13:51 2 年前
- 此快照最后确认于
- 2023/11/02 13:21 2 年前
思路是先从1到n计算一遍每个数进行A操作的代价,然后从1到n如果在P里面,选择每个进行a操作和b操作的达到目标的最小值
CPP#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;
}
各位大佬帮帮
评测记录
回复
共 3 条回复,欢迎继续交流。
正在加载回复...