贪心求助
查看原帖
贪心求助
242524
JRzyh楼主2020/8/30 18:56

样例输出INF

#include<bits/stdc++.h>
#define INF (1ll<<62)
using namespace std;
struct node1
{
	int need,buy,fwash,swash,fuse,suse;
}cnt[2008];
struct node2
{
	int date,store;
};
deque<node2>que;
int totday,buy,fd,fc,sc,sd,ans;
long long getval(int totbuy)
{
	long long totp=totbuy;
	totp*=buy;
	cnt[0].buy=cnt[0].need;
	totbuy-=cnt[0].need;
	for(int i=1;i<totday;i++)
	{
		if(i>=fd)
		{
			node2 temp;
			temp.date=i-fd;
			temp.store=cnt[i-fd].need;
			que.push_back(temp);
		}
		cnt[i].fwash=cnt[i].swash=cnt[i].fuse=cnt[i].suse=0;
		int re;
		if(totbuy>=cnt[i].need)
		{
			totbuy-=cnt[i].need;
			cnt[i].buy=cnt[i].need;
			re=0;
			continue;
		}
		re=cnt[i].need-totbuy;
		cnt[i].buy=totbuy;
		totbuy=0;
		while(re&&!que.empty()&&que.front().date<=i-sd)
		{
			int use=re;
			use=min(use,que.front().store);
			cnt[que.front().date].swash+=use;
			cnt[i].suse+=use;
			totp+=use*sc;
			re-=use;
			que.front().store-=use;
			if(!que.front().store)que.pop_front();
		}
		while(re&&!que.empty())
		{
			int use=re;
			use=min(use,que.back().store);
			cnt[que.back().date].fwash+=use;
			cnt[i].fuse+=use;
			totp+=use*fc;
			re-=use;
			que.back().store-=use;
			if(!que.back().store)que.pop_back();
		}
		if(re)return INF;
	}
	return totp;
}
int base,sum;
int main()
{
	cin>>totday;
	for(int i=0;i<totday;i++)
	{
		cin>>cnt[i].need;
		base=max(base,cnt[i].need);
		sum+=cnt[i].need;
	}
	cin>>buy>>fd>>fc>>sd>>sc;
	int l=base,r=sum;
	long long left=getval(l),right=getval(r);
	while(r-l>=3)
	{
		int len=(r-l)/3;
		int a=l+len,b=r-len;
		long long x=getval(a),y=getval(b);
		if(left<=x&&x<=y||left>=x&&y>=x)
		{
			r=b;
			right=y;
		}
		else
		{
			l=a;
			left=x;
		}
	}
	long long minn=left;
	for(int i=l+1;i<=r;i++)
	{
		long long tmp=getval(i);
		minn=min(minn,tmp);
	}
	cout<<minn;
	return 0;
}
2020/8/30 18:56
加载中...