bzoj1536: [POI2005]Akc- Special Forces Manoeuvres

Description

在一次军事行动中有一批空降兵要降落在沙漠中拆除炸弹. 空降兵按照预定的顺序跳伞并降落到指定的位置.一旦降落他们便呆在原地不动了. 每个空降兵都有一个生存半径. 如果炸弹与他的距离小于或等于这个生存半径的话,空降兵便会引爆炸弹导致死亡. 指挥官想尽量少的派出升降兵.但是在这个目标的前提是至少要能有1名伞兵活着回来.(无论炸弹在何处的情况下都如此). 我们可以假定沙漠抽象成一个二维平面,每个伞兵降落的地点都是这个平面上的一个整点.我们会给定伞兵降落的顺序,每个伞兵都不会不跳,即如果第i个伞兵在沙漠中着陆,那么他前面的所有伞兵肯定都已着陆.求指挥官至少要派出多少空降兵.

Input

第一行一个数n ( 2 <= n <= 2 000) – 空降兵的个数. 接下来n 行每行描述一个空降兵. 每个空降兵用三个整数: x, y 和 r ( -1000 <= x, y <= 1000, 1 <= r <= 5000). 表示空降兵在点(x, y) 着陆, 他的生存半径为 r.

Output

输出一行表示最少需要派出多少空降兵.如果所有的空降兵都有可能牺牲的话输出NIE (NO in Polish).

二分答案,判定时当且仅当所有圆的交严格为空为可行,判定时二分找一条平行y轴的直线使其过所有圆,若不存在这样的直线,或直线上不可能存在一点在所有圆内/上,则交集为空,具体实现见代码。

#include<cstdio>
#include<cmath>
typedef long double ld;
const ld _0=1e-7;
ld x[2007],y[2007],r[2007];
void get(int id,ld X,ld&a,ld&b){
    X-=x[id];
    X=std::sqrt(r[id]*r[id]-X*X);
    a=y[id]-X-_0;
    b=y[id]+X+_0;
}
ld dis(int a,int b){
    ld X=x[a]-x[b],Y=y[a]-y[b];
    return sqrt(X*X+Y*Y);
}
ld cal(int a,int b){
    return x[a]+(x[b]-x[a])*r[a]/dis(a,b);
}
bool chk(int n){
    ld L=x[1]-r[1],R=x[1]+r[1],M;
    for(int i=2;i<=n;++i){
        if(x[i]-r[i]<L)L=x[i]-r[i];
        if(x[i]+r[i]>R)R=x[i]+r[i];
    }
    while(1){
        M=(L+R)/2;
        bool dl=0,dr=0;
        for(int i=1;i<=n;++i){
            if(x[i]+r[i]<M)dl=1;
            if(x[i]-r[i]>M)dr=1;
        }
        if(dl){
            if(dr)return 0;
            R=M;
        }else if(dr)L=M;
        else{
            ld y1,y2,a1,a2;
            get(1,M,y1,y2);
            for(int i=2;i<=n;++i){
                get(i,M,a1,a2);
                if(a1>y1)y1=a1;
                if(a2<y2)y2=a2;
                if(y1>y2){
                    for(int j=1;j<i;++j){
                        get(j,M,y1,y2);
                        if(y1>a2||y2<a1){
                            if(dis(i,j)>r[i]+r[j]+_0)return 0;
                            ld xm=cal(i,j);
                            if(xm>R||xm<L)return 0;
                            if(M<xm)L=M;
                            else R=M;
                            goto out;
                        }
                    }
                }
            }
            return 1;
        }
        out:;
    }
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i)scanf("%llf%llf%llf",x+i,y+i,r+i),r[i]+=_0;
    if(chk(n))return puts("NIE"),0;
    int L=1,R=n,M;
    while(L<R){
        M=L+R>>1;
        if(chk(M))L=M+1;
        else R=M;
    }
    return printf("%d",L),0;
}
时间: 2024-12-21 16:58:50

bzoj1536: [POI2005]Akc- Special Forces Manoeuvres的相关文章

China’s movie heroes 《红海行动》展现中国英雄本色

1 Recent years have seen a trend for big military movies. Whether it was last year’s British hit Dunkirk, starring movie newcomer Harry Styles, or 2014’s American Sniper, featuring Bradley Cooper as a US Navy SEAL, it’s common to see heroes fighting

ZOJ3349——Special Subsequence

Special Subsequence Time Limit: 5 Seconds      Memory Limit: 32768 KB There a sequence S with n integers , and A is a special subsequence thatsatisfies |Ai-Ai-1| <= d ( 0 <i<=|A|)) Now your task is to find the longest special subsequence of a cer

Python Special Syntax 8: 序列化与反序列化--&gt;华丽丽的叫 pickle(泡菜?!)

直接上代码吧 #-*-coding:utf-8 import os if os.path.exists('d:\\cpickle.data'): os.remove('d:\\cpickle.data') import cPickle as P shoplist=['apple','banana','pear'] P.dump(shoplist,file('d:\\cpickle.data','w')) f=file('d:\\cpickle.data') while True: content

Special Judge Ⅱ

Problem Description Q:什么是 Special Judge,Special Judge 的题目有什么不同? A:一个题目可以接受多种正确答案,即有多组解的时候,题目就必须被 Special Judge.Special Judge 程序使用输入数据和一些其他信息来判答程序的输出,并将判答结果返回. NaYe 最近遇到了一个题,要求输出三个数,第三个数为前两个数的和,三个数都是素数,且前两个数小于 500000.他只需要输出任意一组符合要求的答案即认为是 Accepted.现在需

【BZOJ 1528】 1528: [POI2005]sam-Toy Cars (贪心+堆)

1528: [POI2005]sam-Toy Cars Description Jasio 是一个三岁的小男孩,他最喜欢玩玩具了,他有n 个不同的玩具,它们都被放在了很高的架子上所以Jasio 拿不到它们. 为了让他的房间有足够的空间,在任何时刻地板上都不会有超过k 个玩具. Jasio 在地板上玩玩具. Jasio'的妈妈则在房间里陪他的儿子. 当Jasio 想玩地板上的其他玩具时,他会自己去拿,如果他想玩的玩具在架子上,他的妈妈则会帮他去拿,当她拿玩具的时候,顺便也会将一个地板上的玩具放上架

Special Prime

Special Prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 415    Accepted Submission(s): 220 Problem Description Give you a prime number p, if you could find some natural number (0 is not in

hdu 5839 Special Tetrahedron 计算几何 求特殊四面体个数

Special Tetrahedron Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 175    Accepted Submission(s): 64 Problem Description Given n points which are in three-dimensional space(without repetition).

[POI2005]Kos-Dicing|二分|最大流

1532: [POI2005]Kos-Dicing Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1222  Solved: 387[Submit][Status][Discuss] Description Dicing 是一个两人玩的游戏,这个游戏在Byteotia非常流行. 甚至人们专门成立了这个游戏的一个俱乐部. 俱乐部的人时常在一起玩这个游戏然后评选出玩得最好的人.现在有一个非常不走运的家伙,他想成为那个玩的最好的人,他现在知道了所有比赛的安

BZOJ1531: [POI2005]Bank notes

1531: [POI2005]Bank notes Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 229  Solved: 119[Submit][Status] Description Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我们想要凑出面值k求最少要用多少个硬币. Input 第一行一个数 n, 1 <= n <