hdu-2298toxophily(三分法入门系列)

RDCのACM奇幻之旅 RDCのACM奇幻之旅     2022-08-26     318

关键词:

题意:

意大利炮射出炮弹的速度为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选得小一... 查看详情