社区讨论

蒟蒻求助

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 条回复,欢迎继续交流。

正在加载回复...