2013-09-23 21:16

二分答案+匈牙利判断

对于每一个时间,我们重新建一张二分图,由于每个塔可能打多次,所以要拆点,

对于每个拆的点的可行飞行距离为(mid-t1)-(ll-1)*(t1+t2)*v,其中mid为二分的答案

ll为将当前的点拆成第几个点(因为拆的点的时间是不一样的),然后依次判断该点和

入侵者的距离是否小于,是则加边。

建完图之后判断是否存在完美匹配,存在则向下二分,否则向上二分。

//吐槽下,靠靠,t1的单位是秒,t2的单位是分钟。。。

代码只是过了数据,好多地方都可以优化。

比较弱,二分没有标程写的好,标程可以直接得到最后答案。

//By BLADEVIL

var

n, m, t2, v                     :longint;

t1                              :real;

dis                             :array[0..100,0..100] of real;

ans                             :real;

pre, other, last                :array[0..200100] of longint;

link                            :array[0..100] of longint;

flag                            :array[0..100] of boolean;

x1, x2, y1, y2                  :array[0..100] of longint;

l                               :longint;

len                             :array[0..200100] of real;

procedure init;

var

i, j                            :longint;

begin

read(n,m,t1,t2,v);

for i:=1 to m do read(x2[i],y2[i]);

for i:=1 to n do read(x1[i],y1[i]);

t1:=t1/60;

for i:=1 to n do

for j:=1 to m do

dis[i,j]:=sqrt((x1[i]-x2[j])*(x1[i]-x2[j])+(y1[i]-y2[j])*(y1[i]-y2[j]));

end;

procedure connect(x,y:longint; z:real);

begin

inc(l);

pre[l]:=last[x];

last[x]:=l;

other[l]:=y;

len[l]:=z;

end;

function find(i:longint):boolean;

var

q, p                            :longint;

begin

q:=last[i];

while q<>0 do

begin

p:=other[q];

if (not flag[p]) then

begin

flag[p]:=true;

if (link[p]=0) or (find(link[p])) then

begin

link[p]:=i;

exit(true);

end;

end;

q:=pre[q];

end;

exit(false);

end;

procedure judge(low,high:real);

var

mid                             :real;

tot                             :longint;

i, j, ll                        :longint;

k                               :longint;

count                           :longint;

begin

if high<low then exit;

fillchar(last,sizeof(last),0);

fillchar(link,sizeof(link),0);

tot:=0;

l:=1;

mid:=(low+high)/2;

k:=trunc(((mid-t1)/(t1+t2))+1);

for i:=1 to n do

for ll:=1 to k do

begin

inc(tot);

for j:=1 to m do

if (((mid-t1)-(ll-1)*(t1+t2))*v)>=dis[i,j]

then connect(tot,j,dis[i,j]/v+(ll-1)*(t1+t2)+t1);

end;

count:=0;

for i:=1 to tot do

begin

fillchar(flag,sizeof(flag),false);

if find(i) then inc(count);

end;

if (high-low<1e-8) then

if count>=m then

begin

ans:=mid;

end else exit;

if count>=m then

begin

ans:=mid;

judge(low,mid-1e-8);

end else judge(mid+1e-8,high);

end;

procedure main;

begin

judge(1,30000);

writeln(ans:0:6);

end;

begin

init;

main;

end.

wiki 2490 导弹拦截塔的更多相关文章

  1. Codevs2490 导弹防御塔

    2490 导弹防御塔 2490 导弹防御塔 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master         题目描述 Description Freda的城堡—— ...

  2. wiki oi 1044 拦截导弹

    题目描述 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某 ...

  3. HDU-1257 导弹拦截系统 http://acm.hdu.edu.cn/showproblem.php?pid=1257

    Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高 ...

  4. AC日记——导弹拦截 洛谷 P1020 (dp+模拟)

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  5. 【codevs1044】导弹拦截问题与Dilworth定理

    题目描述 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某 ...

  6. TYVJ P1020 导弹拦截 Label:水

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  7. bzoj2044: 三维导弹拦截

    Description 一场战争正在A国与B国之间如火如荼的展开. B国凭借其强大的经济实力开发出了无数的远程攻击导弹,B国的领导人希望,通过这些导弹直接毁灭A国的指挥部,从而取得战斗的胜利!当然,A ...

  8. bzoj3035: 导弹防御塔

    Description Freda的城堡——“Freda,城堡外发现了一些入侵者!”“喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛lala~”“可是入侵者已经接近城堡了呀!”“别担心,rain ...

  9. nyoj 79 导弹拦截

    点击打开链接 拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发 ...

随机推荐

  1. Ubuntu 首次给root用户设置密码

    用过ubuntu的人都知道,刚安装好root用户是没有密码的,没有密码我们就没法用root用户登录.给root用户设置密码输入命令sudo passwd root,然后系统会让你输入密码,这时输入的密 ...

  2. C++类数组批量赋值

    类和结构体不同,结构体在初始化时可以使用{...}的方法全部赋值,但是结构体怎么办呢?一种是把数据数组写到一个相同的结构体内,然后for循环使用一个非构造函数写入到类数组中.另一种方法是直接写入到对应 ...

  3. 使用JDK的keytool生成Android签名证书

    生成证书:keytool -genkey -alias [yourapp] -keyalg RSA -validity 20000 -keystore [yourapp].keystore 输入key ...

  4. throw er; // Unhandled 'error' event&Error: ENOENT: no such file or directory,

    今天做一个文件上传的项目时, 用express-formidable往硬盘里面存文件时, 报  ENOENT:no such file or directory 原因就是程序不能像别的语言一样不存在就 ...

  5. BZOJ 4004 JLOI2015 装备购买 高斯消元+线性基

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4004 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装 ...

  6. 预处理器&预处理变量&头文件保护&条件编译

    [常见的预处理功能] #include 头文件保护符 条件编译 [预处理器] 编译之前执行的一段程序,可以部分地改变我们所写的程序 举个例子:当预处理器看到#include标记时就会用指定的头文件的内 ...

  7. LTE QOS

    http://wenku.baidu.com/link?url=ziFIkdKaC7MU2RY-bTOp2bt87WFPw5_02bqmYs5W6w4ktOfPHEcWesK1U2T7YiyXjVSM ...

  8. libevent 多线程

    对于evbuffer,如果libevent使用了evthread_use_pthreads();那么所有的单个evbuffer操作就已经是原子的了,调用操作相关的接口进去就上锁,出来解锁,那么 evb ...

  9. BZOJ3242 [Noi2013]快餐店 【环套树 + 单调队列dp】

    题目链接 BZOJ3242 题解 题意很清楚,找一点使得最远点最近 如果是一棵树,就是直径中点 现在套上了一个环,我们把环单独拿出来 先求出环上每个点外向树直径更新答案,并同时求出环上每个点外向的最远 ...

  10. CF451E Devu and Flowers 解题报告

    CF451E Devu and Flowers 题意: \(Devu\)有\(N\)个盒子,第\(i\)个盒子中有\(c_i\)枝花.同一个盒子内的花颜色相同,不同盒子的花颜色不同.\(Devu\)要 ...