bzoj 3035 pascal

这道题也是一个二分图匹配的题,也需要用匈牙利算法,但需要小小的改进

中间需要一个二分搜答案的过程,这也是其中的一个小小的变型吧

需要注意一下读入,他是有分钟有秒,所以不要被坑哦

最后不说废话,直接上代码

/**************************************************************

    Problem: 3035

    User: Davidliu

    Language: Pascal

    Result: Accepted

    Time:236 ms

    Memory:4216 kb

****************************************************************/

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.

bzoj 3035 pascal

时间: 2024-09-30 19:21:21

bzoj 3035 pascal的相关文章

BZOJ3160万径人踪灭

题解: 题意即求不连续但间隔长度对称的回文串个数. 若si=sj,则这对字符可以作为以(i+j)/2为中心的回文串的一部分. 用F[i]来表示可以做为以i/2为中心的回文串的一部分的字符对数,则以i/2为中心的回文串数为2^F[i]. 则这就成了多项式乘法:先做一次a的,把字符为a的位置值赋为1,其余为0,进行一次FFT:同理做一次b的. 因为完全连续是不可以的,所以用Manacher求出这样的回文串的个数并减去. 代码: (BZOJ上PASCAL跑得不够快,再加上这题时限只有10s,并没有AC

BZOJ 3714: [PA2014]Kuglarz

呃..好像弃坑了好久=v=..本来打算在bzoj每刷10题合起来写一份题解..但是1个月好像还刷不到10题的样子(水题除外),所以还是单独写一下题解.. Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,-,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品.花费c_ij元,魔术师就会告诉你杯子i,i+1,-,j底下藏有球的总数的奇偶性.采取最优的询问策略,你至少需要花费多少元,才能保证猜出哪些杯子底下藏着球? Input 第一行一个整数n(1<

bzoj 1023: [SHOI2008]cactus仙人掌图 tarjan索环&amp;&amp;环上单调队列

1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1141  Solved: 435[Submit][Status] Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路. 举例来说,上面的第一个例子是一张仙人图,而第二个不是——注意到它有三条简单回路

【BZOJ】【3671】【NOI2014】随机数生成器

贪心 嗯……其实生成这个矩阵就是一个$O(n^2)$的模拟 = = 然后?字典序最小?贪心呗= =能选1就选1,然后能选2就选2…… 我们发现,对于矩阵(1,1)~(n,m),假设1的位置是(x,y),那么我们选完1以后,可选的范围变成了:(1,1)~(x,y) & (x,y)~(n,m),也就是将一个矩阵拆成四块,我们可以在左上和右下两块中递归地进行选择…… 那么我们每次选完之后,新的可选的范围其实暴力O(n)维护就可以了,因为我们总共只选$O(n)$次,每次维护的复杂度是$O(n)$,总复杂

【BZOJ】【1023】【SHOI2008】cactus仙人掌图

DP/仙人掌 题解:http://hzwer.com/4645.html->http://z55250825.blog.163.com/blog/static/150230809201412793151890/ QAQ了 呃……第一次做仙人掌的题目……感觉性质还是蛮神奇的(我是不是应该先做一点环套树的题目呢?>_>) 每个点都只会在一个简单环上,所以在dfs的时候,对于一个环,它上面的点是深度连续的一段(沿着father可以遍历这个环!),然后最后一个点再指回起始点,所以只要low改变了

BZOJ 1013: [JSOI2008]球形空间产生器sphere

二次联通门 : BZOJ 1013: [JSOI2008]球形空间产生器sphere /* BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元 QAQ SB的我也能终于能秒题了啊 设球心的坐标为(x,y,z...) 那么就可以列n+1个方程,化化式子高斯消元即可 */ #include <cstdio> #include <iostream> #include <cstring> #define rg register #define Max

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445

【BZOJ】[HNOI2009]有趣的数列

[算法]Catalan数 [题解] 学了卡特兰数就会啦>_<! 因为奇偶各自递增,所以确定了奇偶各自的数字后排列唯一. 那么就是给2n个数分奇偶了,是不是有点像入栈出栈序呢. 将做偶数标为-1,做奇数标为+1,显然当偶数多于奇数时不合法,因为它压不住后面的奇数. 然后其实这种题目,打表就可知啦--QAQ 然后问题就是求1/(n+1)*C(2n,n)%p了,p不一定是素数. 参考bzoj礼物的解法. 看到网上清一色的素数筛+分解质因数解法,不解了好久,感觉写了假的礼物-- 后来觉得礼物的做法才比

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3