(牛客)游游开车出游 (三分化求最小值)


题目描述

游游准备开车出游,她的车非常特殊,油越多则最高速度越快,即最高速度和油量是成正比的。另外,行驶过程中油是不会消耗的。
已知游游的车初始的最高速度为v0​,当游游花费了ttt时间加油时,车的最高速度会变成v0+t∗x。
游游开车的总里程为y,假设游游始终以最高速度行驶(即忽略加速时间),游游想知道,自己最少花费多少时间可以完成出游?

输入描述:

三个整数v0,x,y,用空格隔开。
0≤v0≤10^9
1≤x,y≤10^9

输出描述:

一个浮点数,代表最终花费的总时间。如果你的答案和标准答案的相对误差不超过10−610^{-6}10−6,则认为答案正确。

示例1

输入

0 1 2

输出

2.8284271
#include
#include
using namespace std;
double v0, x, y;  // 输入的变量v0, x, y
const double N = 1e6;  // 一个很大的常数N,用于表示无穷大
double mintime = N;  // 初始化mintime为N,表示初始最小时间为无穷大

// 计算给定时间t时的总时间
double time(double t)
{
	return  y / (v0 + t * x) + t;
}

int main()
{
	cin >> v0 >> x >> y;  // 输入v0, x, y的值
	double l = 0, r = N;  // 初始化左右边界l和r为0和N

	// 使用三分法进行迭代
	for (int i = 0; i <= 1000; i++)
	{
		double lmid = l + (r - l) / 3;  // 左边界的中点
		double rmid = r - (r - l) / 3;  // 右边界的中点

		// 比较两个中点的时间大小
		if (time(lmid) <= time(rmid))
		{
			r = rmid;  // 更新右边界为右中点
			mintime = min(mintime, time(lmid));  // 更新最小时间
		}
		else
		{
			l = lmid;  // 更新左边界为左中点
			mintime = min(mintime, time(rmid));  // 更新最小时间
		}
	}

	printf("%.7lf", mintime);  // 输出最小时间,保留7位小数
}

你可能感兴趣的:(算法)