关键词:
题意:
意大利炮射出炮弹的速度为v,求在(0,0)击中(x,y)处的目标,发射炮弹的角度。
题解:
设f(α)表示:角度为α,炮弹的横坐标与目标相同时,炮弹的高度。
f(α) = vsin(α) * t - 4.9 * t * t ①
t = x / ( v * cos(α) ) ②
然后,一顿乱搞得f(α) = x*tan(α) - (4.9 * x * x / v / v) * (tan(α) + 1)
妥妥的单峰函数,使用三分得出f(α)取max时的角度r。接下来在[0, r]上二分答
案即可 (把tan(α)看成自变量,用二次函数的性质做,求角度r会比用三分更简
单)
PS: x = 0时,意大利炮往天上开,需要特判。
Trick:“三分 + 二分” 基础连招。
code:
#include <iostream> #include <cmath> using namespace std; const double EPS = 1e-8; int T; double x, y, v; double f(double a) { double t = x/(v*cos(a)); return v*sin(a)*t - 9.8/2*t*t; } int main() { cin >> T; while(T--) { cin >> x >> y >> v; double L = 0, R = acos(-1)/2-EPS; if(x==0) //特判,否则三角函数会智障掉 { if(v*v/2/9.8 > y) printf("%.6lf ", R); else printf("-1 "); continue; } for(int i=1;i<=100;i++) { double mid_L = (L+R) / 2; double mid_R = (mid_L+R) / 2; if(f(mid_L) > f(mid_R)) { R = mid_R; } else { L = mid_L; } } if(f(L) < y) {printf("-1 "); continue;} R = L, L = 0; for(int i=1;i<=100;i++) { double mid = (L+R)/2; if(f(mid) < y) { L = mid; } else { R = mid; } } printf("%.6lf ", L); } }
hdu2298三分
...的,当角度大于一定值时可能会时距离单调递减,所以先三分求个角度范围,保证其点一定在抛物线下方,这样距离和角度的关系就是单调的了,再二分角度即可。 /**@Date:2017-09-2323:17:11*@FileName:HDU2298三分.cpp*@Platform:Win 查看详情
toxophily-数论以及二分三分
G- ToxophilyTimeLimit:1000MS MemoryLimit:32768KB 64bitIOFormat:%I64d&%I64uSubmit cid=83980#status//G/0"class="ui-buttonui-widget 查看详情
[hdu2298]物理推导+二分答案
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2298 #include<bits/stdc++.h>usingnamespacestd;constdoublepi=acos(-1.0);constdoubleg=9.8;constdoubleeps=1e-9;intmain(){intt;scanf("%d",&a 查看详情
p3382模板三分法(代码片段)
...。。这道题其实是可以二分的,但是有更好的算法,叫做三分。三分这种算法用于求单峰函数的最大值或者最小值。算法思想就是弄((l,r))区间的两个三等分点,然后来缩小范围。因为这道题是求峰顶,所以我们可以模拟退火通... 查看详情
机器学习入门系列04,gradientdescent(梯度下降法)
Gitbook整理地址:https://yoferzhang.gitbooks.io/machinelearningstudy/content/20170327ML04GradientDescent.html什么是GradientDescent(梯度下降法)?在第二篇文章中有介绍到梯度下降法的做法,传送门:机器学习 查看详情
三分法(洛谷3382模板三分法)
如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减。试求出x的值。输入格式:第一行一次包含一个正整数N和两个实数l、r,含义如题目描述所示。第二行包含N+1个实数,从高到低依次表示该... 查看详情
[三分法初探]
[UvaErrorCurves]一些二次函数取max的交集还是一个下凸函数。三分即可#include<bits/stdc++.h>#definemaxn10010usingnamespacestd;intn,a[maxn],b[maxn],c[maxn];#defineF(i,x)a[i]*x*x+b[i]*x+c[i]inlinedoublecal(doublex){ doubler 查看详情
三分法(代码片段)
三分法用于求单峰函数顶点对于已知[l,r]中函数单峰求得[l+(r-l)/3,r-(r-l)/3]即横坐标的两个三等分点计算这两点的函数值(使用秦九韶即可较远离顶点的那个(比如向上的峰就取函数值比较小的那个三等分点)作为下一次的边界每... 查看详情
三分法
...单调函数(在一个单调的序列中对某一个元素进行查找)三分法 突破了这种限制,可以用于凸函数或凹函数,这是因为凸函数或凹函数必存在一个最值 三分顾名思义要将一个线段分成3份,可以以线段1/3 与 2/... 查看详情
随意学学三分法
三分法其实是很naive的东西……但是不知道为什么蒟蒻我之前一直没空学……大概就是求一类单峰的函数,每次把区间三分(以求极小值举例),如果$f(mid1)<f(mid2)$说明解在$[L,mid2]$中,反之解在$[mid2,R]$中。裸题1:LA50091#include&l... 查看详情
《c#零基础入门之百识百例》(十九)穷举法--百钱百鸡
C#零基础入门--穷举法前言一,穷举法1.1基本思路1.2优缺点二,穷举法优化2.1穷举法优化策略三,实例练习--百钱百鸡3.1题目描述3.2问题分析3.3参考代码前言本文属于C#零基础入门之百识百例系列文章。此系列文章旨在为学习C#语... 查看详情
算法学习三分法
...没有单调性,而是有一种单峰/谷的特性。我们可以使用三分法来确定这个函数的极值。三分法的具体思想可在别处见到。我就贴一个自己的模板,没有bug……因为我曾经被一个有bug的模板坑害了……速度非常快,常数应该很小... 查看详情
三分法learning
三分法和二分法有些类似,二分处理的是递增/减的函数,而三分处理的是先递增后递减(或相反)的函数的最值。 intlm=l+(r-l)/3,rm=r-(r-l)/3;如上图,lm<rm,则函数最小值在[l,rm]间,再继续三分即可。 反向也是同理,如上... 查看详情
三分法hdu2438turnthecorner
ProblemDescriptionMr.Westboughtanewcar!Soheistravellingaroundthecity.Onedayhecomestoaverticalcorner.Thestreetheiscurrentlyinhasawidthx,thestreethewantstoturntohasawidthy.Thecarhasalengthlandawidthd.Ca 查看详情
[日常摸鱼]三分法
翻到一个三分法的模板发现没有写掉…今天干脆写掉算了…(luogu3382)跟二分基本差不多…#include<cstdio>typedefdoubledl;constdoubleeps=1e-7;constintN=20;dll,r,a[N];intn;inlinedlcalc(dlx){dlres=0,tx=1;for(registerinti=0;i<=n;i++){res+ 查看详情
模板三分法
洛谷33821#include<iostream>2#include<cstring>3#include<cstdlib>4#include<cstdio>5#include<cmath>6#include<algorithm>7usingnamespacestd;8constintmaxn=15,inf=1e9;9intn; 查看详情
数学三分法(代码片段)
...(f(x))在([l,r])内是一个单峰函数,求出单峰点(x)的算法为三分法。Solution考虑对一个区间([l,r]),取三等分点,记做(midl)和 查看详情
[洛谷p3382]模板三分法
...[l,x]上单调增,[x,r]上单调减。试求出x的值。解题思路:三分法。像我这种什么函数都不知道的,只知道要三分。取两个“mid”,然后分别求出答案。如果ansl<ansr,则l=midl,否则r=midr。基本和二分一样。注意eps选得小一... 查看详情