BNU 4260 Trick or Treat && ZOJ 3386 (三分查找)

【题目链接】click here~~

【题目大意】求x轴上一点到各点的最大值中的最小值 点到线段距离 

【解题思路】三分查找

三分查找初学可以参考这篇博客分析:三分查找写的很详细了,其实跟类似于二分查找,理解了如何构造,代码不难实现

方法1:

#include <bits/stdc++.h>
using namespace std;
const double eps=1e-7;
const double inf=0x3f3f3f3f;
const int N=55000;
int n;
struct point
{
    double x,y;
}mapp[N];
double dis(point a,point b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double getmax(double x) //最长边,最长时间
{
    double maxx=eps;
    point q={x,0};
    for(int i=0;i<n;i++)
    {
        double p=dis(q,mapp[i]);
        maxx=max(maxx,p);
    }
    return maxx;
}
int main()
{
    //freopen("1.txt","r",stdin);
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0) break;
        double pleft=N,pright=-N;
        for(int i=0;i<n;i++)
        {
            scanf("%lf%lf",&mapp[i].x,&mapp[i].y);
            pleft=min(pleft,mapp[i].x);  //左边界
            pright=max(pright,mapp[i].x);//右边界
        }
        while((pright-pleft)>eps)
        {
            double mid=(pright-pleft)/3;
            double l,r;
            l=pleft+mid,r=pleft+2*mid;
            if(getmax(l)>=getmax(r)) pleft=l;
            else pright=r;
        }
        printf("%.9f %.9f\n",pleft,getmax(pleft));
    }
    return 0;
}

方法2:

#include <bits/stdc++.h>
using namespace std;
const int N=55000;
const double eps=1e-7;
int n,m;
struct point{
    double x,y;
}mapp[N];
double disget(point a,point b){
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double getmax(double  x){//求最大边,最长时间
    point q={x,0};
    double maxx=eps;
    for(int i=0;i<n;i++){
        double p=disget(q,mapp[i]);
        maxx=max(maxx,p);
    }
    return maxx;
}
double solve(){//赋初值时,最好直接赋数字!
    double pleft=-200000,pright=200000;
    double mid,midd,mid_area,midd_area ;
    while(pright-pleft>eps){
        mid=(pleft+pright)/2.0 ;
        midd=(mid+pright)/2.0 ;
        mid_area=getmax(mid) ;
        midd_area=getmax(midd) ;
        if(mid_area<=midd_area) pright=midd ;
        else pleft=mid ;
    }
    return midd ;
}
int main()
{
    while(scanf("%d",&n)!=EOF){
        if(n==0) break;
        for(int i=0;i<n;i++){
            scanf("%lf%lf",&mapp[i].x,&mapp[i].y);
        }
        double res=solve();
        printf("%.9f %.9f\n",res,getmax(res));
    }
    return 0;
}
时间: 2024-12-21 00:58:59

BNU 4260 Trick or Treat && ZOJ 3386 (三分查找)的相关文章

BNU 4260 ——Trick or Treat——————【三分求抛物线顶点】

ial Judge Prev Submit Status Statistics Discuss Next Type: None None   Graph Theory       2-SAT       Articulation/Bridge/Biconnected Component       Cycles/Topological Sorting/Strongly Connected Component       Shortest Path           Bellman Ford  

[2016-03-05][UVALive][4504][Trick or Treat]

时间:2016-03-05 12:06:59 星期六 题目编号: UVALive 4504 B - Trick or Treat 题目大意:给定坐标轴上若干个点,每个点上有一个人,求x轴上一点,使得所有人到这个点集合所花费的时间最短,所有人同时出发, 输入: 若干组数据,0结束         每组数据         n顶点个数         接下来n行,每个顶点的坐标 double 类型 输出:点的坐标,需要的时间 分析:可以看出,x轴上从左到最优点,到右, 花费的时间 先降低后升高,那么

[BZOJ1589][Usaco2008 Dec]Trick or Treat on the Farm 采集糖果

1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 719  Solved: 408 [Submit][Status][Discuss] Description 每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N(1≤N≤100000)个牛棚里转悠,来采集糖果.她们每走到一个未曾经过的牛棚,就会采集这个棚里的1颗糖果. 农场不大,所以约翰要想尽

[Usaco2008 Dec][BZOJ1589] Trick or Treat on the Farm 采集糖果

1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 438  Solved: 244[Submit][Status][Discuss] Description 每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N(1≤N≤100000)个牛棚里转悠,来采集糖果.她们每走到一个未曾经过的牛棚,就会采集这个棚里的1颗糖果. 农场不大,所以约翰要想尽法子

洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题目描述 Every year in Wisconsin the cows celebrate the USA autumn holiday of Halloween by dressing up in costumes and collecting candy that Farmer John leaves in the N (1 <= N <= 100,000) stalls conven

P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm(Tarjan+记忆化)

P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵循的穿越路线来确保奶牛的乐趣.为了实现这个让奶牛在牛棚里来回穿梭的方案,FJ在第i号隔间上张贴了一个“下一个隔间”Next_i(1<=Next_i<=N),告诉奶牛要去的下一个隔间:这样

Trick or Treat?——***“捣蛋”QAD“发糖”

Dang~Dang~DangTrick or Treat不给糖就捣蛋 万圣节是西方的传统节日,每到万圣节小朋友们都会扮成"牛鬼蛇神"的样子,去敲邻居家的门要糖吃,如果不给糖就会被孩子们捣蛋,扮成小鬼的样子吓人.今天是万圣节之夜,你准备好了吗?(本末有彩蛋哦~) 对企业来说,******就像万圣节的"小鬼"一样,一个猝不及防就让你"崩溃",如何抵御***威胁?信息安全该如何管控?企业要时刻做好"发糖"的准备! 信息安全威胁环境在

三分查找

我们都知道 二分查找 适用于单调函数中逼近求解某点的值. 如果遇到凸性或凹形函数时,可以用三分查找求那个凸点或凹点. 下面的方法应该是三分查找的一个变形. 如图所示,已知左右端点L.R,要求找到白点的位置. 思路:通过不断缩小 [L,R] 的范围,无限逼近白点. 做法:先取 [L,R] 的中点 mid,再取 [mid,R] 的中点 mmid,通过比较 f(mid) 与 f(mmid) 的大小来缩小范围. 当最后 L=R-1 时,再比较下这两个点的值,我们就找到了答案. 1.当 f(mid) >

uvalive 4986(三分查找)

题意:空间内有n个点,求一个最小体积的圆锥把所有点包进去.输出圆锥的高和底面半径.圆锥的底面圆心在(0,0),所有点的z坐标都大于等于0. 题解:因为圆锥体积是 V = 1/3 * π * r^2 * h ,这是一个二次函数,也就是个凸性函数,可以用三分查找的方式枚举两个高,然后找到对应的最小的r,比对两个高得到的体积继续三分查找. #include <cstdio> #include <cstring> #include <algorithm> #include &l