wa4、9求调
查看原帖
wa4、9求调
690243
houluyu楼主2025/8/5 08:02

思路就是减到lim=500之下,然后<=500部分提前求出。不知道为啥wa。求条

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=10005;
int n,a[N],b[N],p[N],f[10001][10001],s[N];
signed main(){
	int lim=0;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>p[i]>>a[i]>>b[i];
		s[i]=s[i-1]+b[i];
	}
  lim=500;
//	for(int nw=0;nw<=10000;nw++){
//		int now=nw;
//		for(int i=1;i<=n;i++){
//			if(p[i]>=now){
//				now+=a[i];
//			}
//			else now-=b[i];
//			now=max(now,0);
//		}
//		f[nw]=now;
//	}
 	for(int i=0;i<=1000;i++){
		if(p[n]>=i)f[i][n]=i+a[n];
		else f[i][n]=max(i-b[n],0ll);
		f[i][n+1]=f[i][n];
	}
	for(int j=n-1;j>=1;j--){
		for(int i=0;i<=1000;i++){
			if(p[j]>=i){
				f[i][j]=f[i+a[j]][j+1];
			}
			else {
				f[i][j]=f[max(i-b[j],0ll)][j+1];
			}
		}
	}
	int q;
	cin>>q;
	while(q--){
		int x;
		cin>>x;
		int l=0,r=n,mid,ans=-1;
		while(l<=r){
			mid=(l+r)/2;
			if(x-s[mid]<=lim){//最少执行多少次
				ans=mid;
				r=mid-1;
			}
			else l=mid+1;
		}
//		cout<<ans<<"a;sdfjka;s"<<endl;
//		cout<<"aaaaa";
		if(ans==-1){
			cout<<x-s[n]<<endl;
		}
		else {
			cout<<f[max(x-s[ans],0ll)][ans+1]<<endl;
		}
//		cout<<f[x]<<endl;
	}
	return 0;
}

2025/8/5 08:02
加载中...