[置顶] FOJ1076 BIT1005 穿越沙漠

这题一开始想不出来,后来看解题报告说

普车在沙漠中建临时油库,是逐步向前推进的,即建好一个油库后,再建下一个油库

就懂了_(:з」∠)_

设从A点到达B点的路中建立了n个油库,从A到B依次编号为Cn,Cn-1,,,,,,,C1

显然C1建立的时候是500升油

设在建立Ci(最后有V1升油的时候)的过程中,用了C(i+1)的 V2升油,车子一开始装了0升油,车子往返了k次(k显然为奇数,一来一往为2次)

Ci与Ci+1的距离为L,一次往返(一来一往)V2减少500,V1增加500-2×L

最后一次从Ci+1开向Ci的过程中,V2减少500,V1增加500-L

则有方程

(k-1)/2*500+500=V2                      一式

(k-1)/2*(500-2*L)+500-L=V1         二式

由于车子每次出发都满载

且V2必大于V1

有V2=V1+X×500  X=1,2,,,,为满足最优取X=1

结合一式和二式解得k=(V1+250)/250    L=(500×250)/(V1+250)  此过程中V1为已知量

初始的V1已知,各个油库的量也可以依次算出来,接下来上代码


#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
	int total;
	cin>>total;
	while(total--)
	{
		double s;
		cin>>s;//总长
		double v1;//v1与以上本篇博客解释同义
		for(v1=0;;v1+=500)//理解为初始要在B点建立0的油库
		{
			s-=(500*250)/(v1+250);
			if(s==0)
			{
				break;
			}
			if(s<0)
			{
				s+=(500*250)/(v1+250);
				break;
			}
		}
		if(s==0)
		{
			v1+=500;
			printf("%.3f\n",v1);
			continue;
		}
		//要在距A点s处建立一个V1的油库,显然有v1/500+1次满载,往返总次数为v1/500*2+1
		printf("%.3f\n",v1+s*(v1/250+1));
	}
	return 0;
}





你可能感兴趣的:([置顶] FOJ1076 BIT1005 穿越沙漠)