Codeforces Round #364 (Div.2) D:As Fast As Possible(模拟+推公式)
题目链接:http://codeforces.com/contest/701/problem/D
题意:
给出n个学生和能载k个学生的车,速度分别为v1,v2,需要走一段旅程长为l,每个学生只能搭一次车,问最少时间到达目的地。
分析:
要使得时间最少,最后车和所有学生应该是同时到达的,我们可以观察到第一组乘车的学生和最后一组乘车的学生两者搭车时间和走路时间是相同的,那么猜想中间所有组的的学生乘车时间和走路时间是相同的(不是乘车==走路),即所有学生的乘车时间相同,走路时间相同。那么第一组学生时间为 l1/v2+(l-l1)/v1,每组搭车前走路的距离为p,有公式
p*tot(为组数-1)/v1+(l-p*tot)/v2,然后用l1表示p,可以得到 (v1*l1/v2+v1*(l-v1*l1/v2)/(v1+v2),那么可以得到l1*((v1/v2+v1/(v1+v2)-v1*v1/(v2*(v1+v2))*tot+1)=l
然后就好了;
代码:
#include<cstdio> #include<iostream> using namespace std; #define LL __int64 LL m,l,v1,v2,k,count; int main() { double l1=0,t; cin>>m>>l>>v1>>v2>>k; if(k==m) cout<<l*1.0/v2<<endl; else { count=(m%k)?m/k:m/k-1; l1=l*1.0/(count*(v1*1.0/v2+v1*1.0/(v1+v2)-v1*v1*1.0/((v1+v2)*v2))+1); t=l1/v2+(l*1.0-l1)/v1; printf("%.10f\n",t); } }
一直地一直地往前走