44分代码求调,3RE+1WA,大致正确
查看原帖
44分代码求调,3RE+1WA,大致正确
726444
taikongsha楼主2025/7/23 08:55
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const ll N=3e5+10;

ll t,n,sum;
ll v[N],c[N];
ll dp1[N],dp2[N],tmp[N];

int main(){
	cin>>n>>t;
	for(int i=1;i<=n;i++){
		cin>>v[i];
	}
	for(int i=1;i<=n;i++){
		cin>>c[i];
		sum+=v[i]*c[i];
	}
	if(sum<t){
		cout<<"-1\n";
		return 0;
	}
	// cout<<t<<" "<<sum<<"\n";
	dp1[0]=0;dp2[0]=0;
	for(int i=1;i<=sum;i++){
		dp1[i]=dp2[i]=1000000000000000000;
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<=sum;j++){
			tmp[j]=dp1[j];
		}
		for(int yu=0;yu<v[i];yu++){
			deque<ll> qe;
			for(int j=yu;j<=sum;j+=v[i]){
				while(qe.size()&&tmp[qe.back()]+(j-qe.back())/v[i]>tmp[j]) qe.pop_back();
				qe.push_back(j);
				while(qe.size()&&(j-qe.front())/v[i]>c[i]&&c[i]!=0) qe.pop_front();
				if(qe.size())dp1[j]=tmp[qe.front()]+(j-qe.front())/v[i];
				else dp1[j]=-1000000000000000000;
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=sum;j++){
			tmp[j]=dp2[j];
		}
		for(int j=v[i];j<=sum;j+=v[i]){
			dp2[j]=min(dp2[j],tmp[j]);
			if(j-v[i]>=0) dp2[j]=min(dp2[j],dp2[j-v[i]]+1);
		}
	}
	ll ans=1000000000000000000;
	for(int i=1;i<=sum;i++){
		if(i-t>=0) ans=min(ans,dp2[i-t]+dp1[i]);
		// cout<<i<<":"/*<<dp1[i]*/<<" "<<dp2[i]<<"\n";
	}
	cout<<ans;
	return 0;
}
2025/7/23 08:55
加载中...