Codeforces Round #364 As Fast As Possible

二分思想,对所要花费的时间进行二分,再以模拟的形式进行验证是否可行。

使用二分法,可以将一个求最优解的问题转化为一个判定问题,优雅的暴力。

#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;
}

  

原文地址:https://www.cnblogs.com/IMGavin/p/5742636.html