二分思想,对所要花费的时间进行二分,再以模拟的形式进行验证是否可行。
使用二分法,可以将一个求最优解的问题转化为一个判定问题,优雅的暴力。
#include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<vector> #include<cmath> #include<utility> using namespace std; typedef long long LL; const int N = 1008, INF = 0x3F3F3F3F; #define MS(a, num) memset(a, num, sizeof(a)) #define PB(A) push_back(A) #define FOR(i, n) for(int i = 0; i < n; i++) int n, k; double dis, v1, v2; bool check(double m){ double ti = 0; int tot = n / k; if(n % k){ tot++; } for(int i = 0; i < tot; i++){ double rem = dis - ti * v1; if(rem <= (m - ti) * v1){ return true; } double len = v1 * (m - ti); double t2 = (rem - len) / (v2 - v1); ti += t2; if(i != tot - 1){ double l2 = rem - len; ti += l2 / (v1 + v2); } if(ti > m){ return false; } } return true; } int main(){ cin>>n>>dis>>v1>>v2>>k; if(k >= n){ printf("%.10f ", dis / v2); }else{ double l = dis / v2; double r = dis / v1; for(int i = 0; i < 100; i++){ double m = (l + r)/2; if(check(m)){ r = m; }else{ l = m; } } printf("%.10f ", l); } return 0; }