社区讨论

-jT2赛时代码求调

灌水区参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@loh9lew7
此快照首次捕获于
2023/11/02 22:11
2 年前
此快照最后确认于
2023/11/03 10:26
2 年前
查看原帖
CPP
#include<iostream>
#include<cstdio> 
#include<algorithm>
#include<cmath>

#define ll long long 
using namespace std;

inline int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f*=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
	return x*f; 
}
int k;//剩余可走多少路 
int n,d,v[100010],a[100010],hz[100010],sta[100010],top,prv[100010],ans; 
int main(){
//	freopen("road.in","r",s/*tdin);
//	freopen("road.out","w",st*/dout);
	n=read(),d=read();
	for(int i=1;i<n;i++){
		v[i]=read();
	}
	for(int i=n-1;i>=1;i--){
		prv[i]=v[i]+prv[i+1];
		
	}
	for(int i=1;i<=n;i++){
		a[i]=read();
		while(top&&a[sta[top]]>a[i]){hz[sta[top]]=i;top--;}
		sta[++top]=i;
	}
	while(top){
		hz[sta[top]]=-1;
		top--;
	}
	for(int i=1;i<=n;){
		if(hz[i]==-1){
			if(k>prv[i]){
				cout<<ans<<endl;
				return 0;
			}
			int p=ceil((prv[i]-k)/d);
			ans+=p*a[i];
			break;
		}else{
			if(k>prv[i]-prv[hz[i]]){k-=prv[i]-prv[hz[i]];i=hz[i];continue;}
			int p=ceil((1.0*prv[i]-prv[hz[i]]-k)/d);
			k%=d;
			k+=1.0*p*d-(prv[i]-prv[hz[i]]);//油量可走多少
			ans+=p*a[i];
			i=hz[i];
			if(k>prv[i])
				break;
		}
	}
	printf("%d\n",ans);
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...