【bzoj1038】瞭望塔

题意

  致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安。我们将H村抽象为一维的轮廓。如下图所示 我们可以用一条山的上方轮廓折线(x1, y1), (x2, y2), …. (xn, yn)来描述H村的形状,这里x1 < x2 < …< xn。瞭望塔可以建造在[x1, xn]间的任意位置, 但必须满足从瞭望塔的顶端可以看到H村的任意位置。可见在不同的位置建造瞭望塔,所需要建造的高度是不同的。为了节省开支,dadzhi村长希望建造的塔高度尽可能小。请你写一个程序,帮助dadzhi村长计算塔的最小高度。

分析

分析1:模拟退火+二分

调不出来。

调得出来的时候估计阳寿已尽。

有生之年内应该不会调得出来吧。

就放一个半成品代码吧。

#include <cstdio>
#include <cctype>
#include <cmath>
#include <ctime>
#include <algorithm>
using namespace std;

#define rep(i,a,b) for (int i=(a);i<=(b);i++)

const int N=512;

const double MAX=1e11;
const double EPS=1e-6;

const int T=1;
const double SPEED=0.99;
const double END=0.00001;

int rd(void);

int n;
struct point {
    double x,y;
    point(double _x=0,double _y=0) {
        x=_x,y=_y;
    }
    friend point operator - (point a,point b) {
        return point(a.x-b.x,a.y-b.y);
    }
}p[N];
double det(point a,point b) {
    return a.x*b.y-a.y*b.x;
}

double now; double nd;
double ans;

int rd(void) {
    int x=0,f=1; char c=getchar();
    for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
    for (;isdigit(c);c=getchar()) x=x*10+c-'0';
    return x*f;
}

int cmp(double a) {
    if (fabs(a)<EPS) return 0;
    return a<0?-1:1;
}

int Check(double xn,double yn) {
    rep(i,2,n) {
        double t=det(p[i-1]-point(xn,yn),p[i]-point(xn,yn));
        if (cmp(t)<0) return 0;
    }
    return 1;
}

int InBorder(double xn,double l,double r) {
    return cmp(xn-l)>=0&&cmp(r-xn)>=0;
}

double Solve(double xn) {
    double l=0,r=MAX;
    while (cmp(r-l)>0) {
        double mid=(l+r)/2;
        if (Check(xn,mid))
            r=mid;
        else l=mid;
    }

    double bsH;
    rep(i,1,n-1)
        if (InBorder(xn,p[i].x,p[i+1].x)) {
            double k=(p[i+1].y-p[i].y)/(p[i+1].x-p[i].x),b=p[i].y-k*p[i].x;
            bsH=k*xn+b;
            break;
        }

    return l-bsH;
}

double RandFloat(void) {
    return rand()%1000/1000.0;
}

double SA(void) {
    now=(p[1].x+p[n].x)/2.0;
    nd=Solve(now);
    double res=nd;
    for (double tem=p[n].x-p[1].x;tem>END;tem*=SPEED) {
        double nx=now+tem*(RandFloat()*2-1);
        if (!InBorder(nx,p[1].x,p[n].x)) continue;
        double nxd=Solve(nx); double slack=RandFloat();
        if (cmp(nxd-nd)<0||cmp(tem-slack)>0) {
            now=nx;
            nd=nxd;
            res=min(res,nxd);
        }
    }
    return res;
}

int main(void) {
    #ifndef ONLINE_JUDGE
    freopen("bzoj1038.in","r",stdin);
    freopen("bzoj1038.out","w",stdout);
    #endif

    srand(19980406); 

    n=rd();
    rep(i,1,n) p[i].x=rd();
    rep(i,1,n) p[i].y=rd();

    ans=MAX;
    rep(tms,1,T) {
        double t=SA();
        ans=min(ans,t);
    }
    printf("%0.3lf\n",ans);

    return 0;
}

分析2:三分法

对于一条线段,上面的点的答案必然是单峰的。

证明略,自己画个图YY去吧。

有一篇题解:http://blog.csdn.net/Fuxey/article/details/50528819

分析3:半平面交

http://blog.csdn.net/regina8023/article/details/43935773

【bzoj1038】瞭望塔的更多相关文章

  1. BZOJ1038 瞭望塔

    学习了半平交面. 我这里写的是训练指南中的双端队列,每次判断是否删去更优然后更新. 看hzwer中有一处不太明白就是为何要将两段加入队列 后来对拍出错才知道是因为精度,当两线重合时他们叉积返回值是一个 ...

  2. 【BZOJ1038】[ZJOI2008]瞭望塔 半平面交

    [BZOJ1038][ZJOI2008]瞭望塔 Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如 ...

  3. bzoj1038: [ZJOI2008]瞭望塔

    Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, ...

  4. bzoj千题计划126:bzoj1038: [ZJOI2008]瞭望塔

    http://www.lydsy.com/JudgeOnline/problem.php?id=1038 本题可以使用三分法 将点按横坐标排好序后 对于任意相邻两个点连成的线段,瞭望塔的高度 是单峰函 ...

  5. 【bzoj1038】瞭望塔 半平面交

    题目描述 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, y1), ( ...

  6. 【BZOJ1038】【ZJOI2008】瞭望塔 [模拟退火]

    瞭望塔 Time Limit: 10 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Description 致力于建设全国示范和谐小村庄的H村村 ...

  7. 「BZOJ1038」「洛谷P2600」「ZJOI2008」瞭望塔 半平面交+贪心

    题目链接 BZOJ/洛谷 题目描述 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安. 我们将H村抽象为一维的轮廓.如下图所示: 我们可以用一条山的上方 ...

  8. [BZOJ1038][ZJOI2008]瞭望塔(半平面交)

    1038: [ZJOI2008]瞭望塔 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2999  Solved: 1227[Submit][Statu ...

  9. 刷题总结——瞭望塔(bzoj1038)

    题目: Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线 ...

随机推荐

  1. Cpdetector编码识别

    概述 浏览器在打开一个网页时,首要任务是判断网页的编码格式,然后采用合适的编码进行解析:我们常用的文本编辑器在打开文档时同样需要判断文档的编码进行相应的解析.这涉及到的技术就是编码甄别,下面我们介绍一 ...

  2. linux 切换多个jdk脚本

    1,编写脚本 jdkswitch.sh #!/bin/sh # usage: . this_file [argvs] openjdk7_home=/usr/lib/jvm/java--openjdk- ...

  3. Hibernate体系结构的简单介绍

    Hibernate体系结构的简单介绍 1.SessionFactory: 单个数据库映射关系经过编译后的内存镜像,是线程安全的.它是生产Session的工厂,本身需要依赖于ConnectionPeov ...

  4. 关于打开MTK_SDCARD_SWAP 宏后MTK目前升级方案和 关于打开MTK_SHARED_SDCARD宏后MTK目前升级方案

    如果设置宏MTK_SDCARD_SWAP=yes:默认是优先从外卡获取升级包,外卡没有包,才会去内卡获取!   1.插入外卡,升级包update.zip放入外卡,升级可以成功!   2.插入外卡,升级 ...

  5. .Net(C#)Parallel"循环"的解释以及与循环的比较

    Parallel 类提供对并行循环和区域的支持. 许多个人计算机和工作站都有两个或四个内核(即 CPU),使多个线程能够同时执行. 在不久的将来,计算机预期会有更多的内核. 为了利用当今和未来的硬件, ...

  6. JS中string对象的一些方法

    原文地址(包含所有的string对象的方法):  http://www.dreamdu.com/javascript/object_string/ string.slice(startPos,endP ...

  7. TCP服务器不回复SYN的问题

    个人问题发生环境: 1.TCP服务器是虚拟机,IP地址是192.168.8.12. 2.TCP客户端是宿主机,IP地址是192.168.8.11. 3.从宿主机(192.168.8.11)上启动Soc ...

  8. Oracle同义词学习

    oracle的同义词总结   从字面上理解就是别名的意思,和视图的功能类似.就是一种映射关系.   同义词拥有如下好处:   节省大量的数据库空间,对不同用户的操作同一张表没有多少差别;   扩展的数 ...

  9. Mac : 强大的截图

    来源:http://irising.me/2011/11/12135/ Mac的截图功能扩展功能很强大的,不要用QQ那个COM+Ctrl+A弱爆了的截图了~ 首先说一下两种截图1.Command+sh ...

  10. ASP.NET 2.0 异步页面原理浅析 [1]

    与 ASP.NET 1.0 相比,ASP.NET 2.0 的各方面改进可以说是非常巨大的.但就其实现层面来说,最大的增强莫过于提供了对异步页面的支持.通过此机制,编写良好的页面可以将数据库.WebSe ...