您的位置:首页 > 其它

PAT 1033 To Fill or Not to Fill 贪心

2014-08-29 23:42 369 查看
PAT少有的思维题...

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
struct node
{
	double p,dis;
}e[550];
bool cmp(node x,node y)
{
	return x.dis<y.dis;
}
int main()
{
	int n,i,j;
	double m,d,dd,ans;
	cin>>m>>d>>dd>>n;
	for(i = 1;i<=n;i++)cin>>e[i].p>>e[i].dis;
	e[++n].dis = d;
	e
.p = 0.0;
	sort(e+1,e+n+1,cmp);
	if(e[1].dis!=0)
	{
		printf("The maximum travel distance = 0.00\n");
		return 0;
	}
	int f = 0,ps;
	double lft = 0;
	for(i = 1;i<n;i++)
	{
		if((e[i+1].dis-e[i].dis)>m*dd)
		{
			f = 1;
			ps = i;
			break;
		}
		int ii = i+1;
		while((e[ii].dis-e[i].dis)<=m*dd&&e[ii].p>e[i].p)ii++;
		if((e[ii].dis-e[i].dis)>m*dd)ii--;
		if(e[ii].p<e[i].p)
		{
			double nd = (e[ii].dis-e[i].dis)/dd;
			if(lft<nd)
			{
				ans+=(nd-lft)*e[i].p;
			    lft = nd-(e[i+1].dis-e[i].dis)/dd;
			}
			else lft-=(e[i+1].dis-e[i].dis)/dd;
		}
		else 
		{
			ans+=(m-lft)*e[i].p;
			lft = m-(e[i+1].dis-e[i].dis)/dd;
		}
	}
	if(f)printf("The maximum travel distance = %.2f\n",e[ps].dis+m*dd);
	else printf("%.2f\n",ans);
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: