30分求助
查看原帖
30分求助
313082
Roden楼主2020/12/2 21:34

WA到死,还请各位大佬帮助

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
ll mt[16],mg[16];
ll equation(ll a,ll b,ll c)
{
	if(b*b-4*a*c<0)return -1;
	double res=-b-sqrt(b*b-4*a*c);
	res/=2*a;
	return res;
}
bool check(int n)
{
	ll eff=1,goods=0,tim=0;// eff 当前生产力,goods 当前已生产商品总数,tim当前时间
	for(int i=1;i<=n;i++)
	if(goods>=mg[i]){
		eff+=mt[i]-tim;
		goods+=eff*(mt[i]-tim);
		tim=mt[i];
	}else{
		ll maxt=mt[i]-tim;
		for(int j=i;j<=n;j++)
		{
			ll r=equation(-1,mt[j]-tim-eff,eff*(mt[j]-tim)+goods-mg[j]);
			maxt=min(maxt,r);
		}
		if(maxt<0)return false;
		eff+=maxt;
		tim+=maxt;
		goods+=(mt[i]-tim)*eff;
		tim=mt[i];
		if(goods<mg[i])return false;
	}
	return true;
}
int T[16],G[16],M[16];
int main()
{
#ifndef ONLINE_JUDGE
	freopen("stdin.txt", "r", stdin);
#endif
	int n;cin>>n;
	for(int i=0;i<n;i++)
		cin>>T[i]>>G[i]>>M[i];
	ll ans=0;
	for(int S=(1<<n)-1;S>0;S--)
	{
		int cnt=0;ll sum=0;
		for(int i=0;i<n;i++)
		if(S>>i&1)
		{
			cnt++;
			mt[cnt]=T[i];
			mg[cnt]=G[i]+mg[cnt-1];//mg 为到订单i总共所需商品数
			sum+=M[i];
		}
		if(check(cnt))
			ans=max(ans,sum);
	}
	printf("%lld",ans);
	return 0;
}
2020/12/2 21:34
加载中...