首页 > 其他分享 >题解: P6933

题解: P6933

时间:2023-10-06 16:22:50浏览次数:43  
标签:P6933 二分 10 int 题解 mid 答案 double

题目传送门

这道题我用的是二分答案,只不过这道题和一般的二分答案有些不同,是浮点数的二分答案。那自然和整数的二分答案有些不同,下面我会说到。我们先来看一下思路解法。

思路解法

首先确定了是二分答案,我们需要先确定初始的 \(l\) 和 \(r\) 和 check 函数。

check 函数好写,我们可以根据

\[t_i = \frac{d_i}{s_i+c} \]

这个公式来求出每段路程的时间。最后将总和与 \(t\) 比较,判断当前二分到的 \(c\) 的大小。

那如何判断 \(c\) 是大还是小呢,我们回到上面那个公式,如果 \(t_i\) 的总和比 \(t\) 要大,说明 \(c\) 小了,那应该去右半区间中找 \(c\)。

接下来我们来确定初始的 \(l\) 和 \(r\)。我们再回到上面的公式中,可以看出 \(s_i+c > 0\),那么所以 \(c > -s_i\) 所以 \(l\) 应取 \(s_i\) 最小值的相反数。

通过数据范围可以看出 \(t_i\) 的最大值为 \(10^6\),\(s_i\) 的最小值为 \(10^3\),所以 \(c\) 的最大值为 \(10^6 - 10^3\)。大家可以尝试根据上面的公式推一下,不过 \(r\) 的最大值可以取得大一些,无非就是多循环几次,影响不大。

不过此题还是有几个点需要注意的:

首先就是浮点数的二分答案和整数的二分答案的区别。因为题目中说明了输出与正确答案的差应在 \(10^6\) 以内,所以循环的判断条件应为 while((r-l)>=1e-7)

同时浮点数是不能使用位运算的,所以应为 mid=(l+r)/2

第二个需要注意的地方是翻译有点问题,题目中的单位均为英里和英里每小时,所以是不需要单位转换的。

最后一个也是最坑的地方,除了 \(n\) 输入为整数,其他的输入时均为实数,所以应该使用 double 而非 int

代码

#include<iostream>
#include<cstdio>
using namespace std;
int n;
double t,d[1005],s[1005],l=1e9,r=2e6;
bool check(double c){
	double ans=0;
	for(int i=1;i<=n;i++){
		ans+=(d[i])/(s[i]+c);
	}
	return ans>=t;
}
int main(){
	scanf("%d%lf",&n,&t);
	for(int i=1;i<=n;i++){
		scanf("%lf%lf",&d[i],&s[i]);
		l=min(s[i],l);
	}
	l=-l;
	while((r-l)>=1e-7){
		double mid=(l+r)/2;
		if(check(mid)) l=mid;
		else r=mid;
	}
	printf("%.7f",l);
	return 0;
}

标签:P6933,二分,10,int,题解,mid,答案,double
From: https://www.cnblogs.com/yzxgg/p/solution-p6933.html

相关文章

  • 【UVA 514】Rails 题解(栈+队列)
    PopPush市有一个著名的火车站。那个里的乡村是令人难以置信的丘陵。车站建于上世纪。不幸的是,当时资金极其有限。有可能仅建立表面轨迹。此外,事实证明,该站可能只是一个死胡同(见图片),由于缺乏可用空间,它只能有一个轨道。当地的传统是,每一列从A方向到达的火车都会继续朝A方向行驶......
  • 【题解 P4550】 收集邮票
    收集邮票题目描述有\(n\)种不同的邮票,皮皮想收集所有种类的邮票。唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是\(n\)种邮票中的哪一种是等概率的,概率均为\(1/n\)。但是由于凡凡也很喜欢邮票,所以皮皮购买第\(k\)次邮票需要支付\(k\)元钱。现......
  • neovim的插件管理器vim-plug导致代码颜色不显示问题解决
    neovim的帮助文件路径F:\Programs\Neovim\share\nvim\runtime\docruntimepath的帮助文档路径F:\Programs\Neovim\share\nvim\runtime\doc\options.txt$VIM环境变量$VIM被用来确定Vim中不同的用户文件的位置,比如用户启动脚本“.vimrc”。这个是系统设置,详见startup。允许每......
  • 关于洛谷题解审核
    我想问一下,大家觉得题解的重点是什么?很显然是思路,代码的正确性,次要的才是格式。但是,洛谷对于题解格式的审核是不是有点过于严格了呢?比如说这段话:如果\(n\)为\(0\),那么便是无解。大家能一眼看出,后面多了空格吗?这种题解其实没什么大问题,别人看题解时根本不会在意这些......
  • 【bitset】【线段树】CF633G Yash And Trees 题解
    CF633G简单题。先看到子树加和子树质数个数和,果断转换为dfs序进行处理。既然有区间求和,考虑线段树。若对于每一个节点维护一个\(cnt\)数组,用二进制数\(x\)来表示,即当\(cnt_i=1\)时第\(i\)位为\(1\)。设当前节点为\(u\),左右子节点分别为\(ls\)和\(rs\)。发现......
  • 【倍增】P3422 [POI2005]LOT-A Journey to Mars 题解
    P3422一道有点意思的题。看到是一个环,先破环为链,即\(a_{n+i}=a_i,b_{n+i}=b_i\),此时就只需要跳到\(x+n\)而无需判环了。如果顺时针走:令\(sum_i=\sum\limits_{j=1}^{i}{a_j-b_j}\),当能从\(x\)跳到\(x+n\)时,有\[sum_{x-1}\lesum_x,sum_{x-1}\lesum_{x+1},\dot......
  • 【DP】ABC273F Hammer 2 题解
    ABC273F一道比较板的区间\(\text{dp}\)。先对坐标离散化,令离散化数组为\(v\)。令\(f_{i,j}\)表示能走到区间\([v_i,v_j]\)的最短路程,显然\(f\)数组初始为\(inf\)。但发现这样无法转移,可以再增加一维\(k\in\{0,1\}\),表示此时在\([v_i,v_j]\)的\(v_i/v_j\)处。......
  • 【线段树合并】CF1805E There Should Be a Lot of Maximums 题解
    CF1805E待补:有另解看到维护树上问题,可以想到线段树合并。但直接维护显然不行,要一点技巧。发现\(val\)的出现次数\(cnt_{val}\)如果\(\ge3\),那么一定是一个候选项,若\(cnt_{val}=1\),那么一定不能作为候选项。于是可以用权值线段树维护对于\(val\)有\(cnt_{val}=......
  • [ABC257F] Teleporter Setting 题解
    1.题目洛谷传送门2.思路我们可以把不确定的点当成真实存在的\(0\)号点,建边的时候就正常连即可。然后我们来看一个样例:1-2-03-4-5当我们把\(0\)号点看成\(3\)号点时,答案就是\(1\)号点到\(0\)号点的距离加上\(3\)号点到\(5\)号点的距离。然后我们再......
  • 【思维】【DP】ABC298Ex Sum of Min of Length 题解
    ABC298Ex简单题。因为有\(\min\)不好做,容易想到讨论\(d(i,L)\)和\(d(i,R)\)的大小。令\(p=\text{LCA}(L,R)\),\(dep_L>dep_R,dist=dep_L+dep_R-2\timesdep_p\),\(now\)满足\(dep_L-dep_{now}=\lfloor\dfrac{dist}{2}\rfloor\)则\(L\)一定在......