您的位置:首页 > 其它

codeforces 364 div2 D As Fast As Possible

2016-08-07 19:38 423 查看
题目大意:一群小学生从起点走到终点,期间雇了一辆车来载学生,但车可能坐不下那么多人,问所有学生到达终点最短时间。

最优方案是把第一批学生运到离起点x远的地方,然后车子返回运第二批,装着第二批人的车子追上第一批小学生,让第二批人下车和第一批人一起走,注意从头到尾整个过程小学生都是走着的而不是在原地发呆。。然后运第三批人重复这一过程,最优解就是最后一批人追上前面的人也就刚好到达终点了。然后我们来看一下这中间的奇妙性质,车子运第一批人,把第一批人放下来,这时第一批人和后面的人的距离是y的话那么这个距离就一直不变,且人群只分成两种既走在前和走在后的。很简单,小学生走路速度不变,并且车子是把后面的人运到前面所以间距不变。既然间距不变,那么车子返回装人并赶上前面一拨人的时间也是不变的,既车子第二次,第三次......往返的时间是不变的。

分析一波后,设最优解为t,把第一批学生运到离起点x远的地方,总装载次数floor(n/k)+1,除去第一次往返floor(n/k)次,列两个等式就得到t了。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;

const int maxn=100000+6;

int main()
{
int n,l,x,y,k;
double v1,v2;
scanf("%d%d%d%d%d",&n,&l,&x,&y,&k);
v1=x;v2=y;
int z= n%k?n/k+1:n/k;
z--;
double ans=((v1+v2)*l+v2*l*2*z)/( (v2-v1)*(v1+v2)+v1*(v1+v2)+v1*v2*2*z );
printf("%.10f\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MATH