首页 > 其他分享 >D: Space Golf[二分+数学]

D: Space Golf[二分+数学]

时间:2023-08-16 17:34:51浏览次数:26  
标签:二分 frac Space int double return zx Golf include

题意大概是给你一个小球,完全弹性碰撞,有若干高度的板子,问从0-target的最小合速度是多少。

完全弹性碰撞,意味着给定一个初始速度,运动轨迹将是一个抛物线的不相交的等距(d/(i+1))右移。i是弹跳次数

而确定好水平速度后,球的落点就是确定的,那么当y能过的时候,任何大于y的高度也能过去。所以我们可以用二分来求得跳一个固定次数时的最低高度是多少。

对于一个高度和跳的次数,我们可以求得最后的合速度的平方的一个式子

 

$v^2=2y+\frac{\frac{x^2}{4}}{2y}$

然后需要注意的是,这个式子说明$v^2$是和两个变量相关的。如果x为定值的时候,y作为自变量,$v^2$作为因变量,这是一个对勾函数

它的最小值所在处是$\frac{x}{2}$处。

这里就出现一个问题,如果我们求得的y是小于$\frac{x}{2}$的,那么$v^2$的最小值反而不是y最小处,而是$\frac{x}{2}$处。不能想当然认为y越小最后值就最小。

查看代码

#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#define eps 1e-8
#define g 1.0
using namespace std;
typedef long long ll;
double d,n,b;
struct ban
{
	double x,h;
	bool operator<(ban b)const
	{
		return x<b.x;
	}
}a[15];
double zx;
double hev(double zx,double zy)
{
	double vb=sqrt(2*zy),va=zx/2/sqrt(zy*2);
	if(zx/4>zy)
	return sqrt(zx);
	return sqrt(va*va+vb*vb);
}
double cal(double x,double m,double h)
{
	return -h*(x-m)*(x+m)/(m*m);
}
bool check(double zy)
{
	double h,t;
	double mid=zx/2;
	vector<int>inner;
	int x=1,y=1;
	while(x<=n)
	{
		inner.clear();
		while(a[x].x<=y*zx&&x<=n)
		{
			inner.push_back(x);
			x++;
		}
		for(auto sz:inner)
		{
			double xzb=a[sz].x-mid;
			if(a[sz].h>cal(xzb,zx/2,zy)+eps)
				return 0;
		}
		y++;
		mid+=zx;
	}
	return 1;
}
signed main()
{
	cin>>d>>n>>b;
	for(int i=1;i<=n;i++)
		cin>>a[i].x>>a[i].h;
	sort(a+1,a+1+(ll)n);
	double ans=1e10;
	for(int i=0;i<=b;i++)
	{
		zx=d/(i+1);
		double l=0,r=1e6;
		while(l+eps<r)
		{
			double mid=(l+r)/2;
			if(check(mid))
			{
				cout<<"1\n";
				r=mid;
			}
			else l=mid;
		}
		ans=min(ans,hev(zx,l));
	}
	printf("%.5lf",ans);
	return 0;
}

标签:二分,frac,Space,int,double,return,zx,Golf,include
From: https://www.cnblogs.com/qbning/p/17635723.html

相关文章

  • 704. 二分查找、27. 移除元素
    704.二分查找、27.移除元素704.二分查找力扣题目链接(opensnewwindow)给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4......
  • 执行kubeadm 出现 FATAL: the ConfigMap "kubeadm-config" in the kube-system namesp
    现象: [upgrade/config]Makingsuretheconfigurationiscorrect:[upgrade/config]Readingconfigurationfromthecluster...[upgrade/config]FYI:Youcanlookatthisconfigfilewith'kubectl-nkube-systemgetcmkubeadm-config-oyaml'[upgrade/c......
  • 二分图的一些概念
    二分图:将图中的顶点分为两个集合X和Y,X与Y集合没有交集,并且各自集合内的点没有边相连,X集合与Y集合形成边二分匹配:在二分图的基础上,XY两个集合所形成的边集中的子集M,M中的任意两条边没有公共的顶点最大匹配:当M中的边数达到二分图的上限时称为最大匹配完美匹配:二分图中的所有顶点......
  • [二分图] 学习笔记
    定义无向图可以分成两个点集,集合内的点不相连通,不允许存在奇环//二分图的判定#include<bits/stdc++.h>usingnamespacestd;constintN=1e3+10,M=2e6+10;struct{ intto,next;}e[M];inttop,h[N],color[N],n,m;voidadd(intx,inty){ e[++top]......
  • HDU 3829 Cat VS Dog 猫和狗(二分图)结题报告
    听学长说这道题很ex,但是思路想到的话还是挺简单的。可能是受上一道题(放置机器人)的启发,也是找互相冲突的点连线。但是并不是完全一样(废话)放置机器人那道题是找到冲突点连线后直接求最大匹配即可。这道题稍微把思路变换一下,求出最大完美匹配数\(n\)后,说明有\(n*2\)个人的喜好......
  • 704. 二分查找
    参考链接:https://programmercarl.com/0704.二分查找.html#思路给定一个n个元素有序的(升序)整型数组nums和一个目标target,写一个函数搜索nums中的target,如果目标值存在,就返回下标,否则返回-1。tips:假设nums所有元素不重复n在[1,10000]之间nums的每个元素都将在[-9999,9999]之......
  • 二分
    二分介绍相信大家小时候都玩过猜数字的游戏,一般来说,大家都是从中间开始猜,比如猜0~100之间的整数,先猜50,小了再猜75,大了再猜35。我们在玩这个游戏时就使用了二分这个思想,在算法竞赛中,我们对具有单调性的问题便可以使用二分,是一种非常好用的算法,但是二分里面的坑也非常多,稍有不慎便......
  • C++STL库 二分查找,以及对set集合进行二分查找,来源于”leetcode7022. 限制条件下元素之
    C++的头文件<algorithm>中有用于二分查找的函数,lower_bound()、upper_bound()以及binary_search():lower_bound():返回大于等于目标值的第一个位置upper_bound():返回大于目标值的第一个位置,binary_search():若目标值存在则返回true,否则返回false参数列表:(起始位置,结束位置,目标值) ......
  • 二分板子
    1.求最大值最小while(l<=r){  mid=(l+r)>>1;  if(check(mid))ans=mid,r=mid-1;    elsel=mid+1; }例题洛谷p3853路标设置code#include<bits/stdc++.h>usingnamespacestd;intl,n,k,a[100010],r,ll,mid,ans,cnt;boolcheck......
  • CodeForces 1610F Mashtali: a Space Oddysey
    洛谷传送门CF传送门比较有启发性的题。首先,设\(a_u\)为与点\(u\)相连的边权和,答案的上界显然是\(\sum\limits_{i=1}^n[a_u\bmod2=1]\)。之后我们把P7816「Stoi2029」以父之名第一篇题解的做法搬过来,也就是:建一个虚点向原图度数为奇数的点连边权为\(1\)的边......