题意 : 给出一个 N * M 的网格,然后给你 K 条鱼给你放置,现有规格为 r * r 的渔网,问你如果渔网随意放置去捕捞小鱼的情况下,捕到的最大期望值是多少?

分析 : 

有一个很直观的想法就是如果将鱼放在越靠近中间的位置,其被捕捞的可能性越大

事实也的确如此,鱼的位置越靠近边缘则能覆盖到它的渔网安放位置就越少

那么这就有了一个贪心的算法

将第一条鱼放在最中间的位置算出被捕捉的概率

被捕捉的概率 = 能覆盖到当前小鱼位置的渔网个数 / 整个网格的全部安放渔网的方法数

然后从中间这个点开始向四周扩散,然后再找出概率最大的来进行扩张

因为概率越大说明其位置越靠近中间,所以首选概率最大的点进行扩张

这很像 BFS 的过程,所以我们可以使用一个优先队列来维护扩散出来的最大概率

然后选出前 K 个即可

对于每一个点能被多少个渔网放置方法覆盖,有个简便的方法

我们先分别算出横纵上的每一个点被覆盖的方法数即 (1~N, 1) 和 (1, 1~M)

然后对于中间的某个点,只要将刚刚算出来的结果进行相乘即可例如 (N, M) = (N, 1) * (1, M)

#include<bits/stdc++.h>
#define LL long long
using namespace std;
;
,  -,   ,  };
,   ,  -,  };
struct NODE{
    double P;
    int row, col;
    NODE(){};
    NODE(int r, int c, double p):row(r),col(c),P(p){};
    bool operator < (const NODE &rhs) const{
        return this->P < rhs.P;
    };
};

set<pair<int, int> > s;///由于N*M太大了,所以用set进行判重
priority_queue<NODE> que;
int R[maxn], C[maxn];
int n, m, r, k;

bool bound(int row, int col)///判断是否越界,越界返回 true
{  || col< || row>n || col>m); }

int add[maxn];
inline void Calculate_R_Array(int len, int r)///计算纵轴上每个点被覆盖的方案数
{
    ; i<=len-r+; i++)
        add[i]++, add[i+r]--;
    ;
    ; i<=len; i++)
        sum += add[i],
        R[i] = sum;
}

inline void Calculate_C_Array(int len, int r)///计算横轴
{
    ; i<=len-r+; i++)
        add[i]++, add[i+r]--;
    ;
    ; i<=len; i++)
        sum += add[i],
        C[i] = sum;
}

int main(void)
{
    while(~scanf("%d %d %d %d", &n, &m, &r, &k)){
        s.clear(); while(!que.empty()) que.pop();
        LL tot = (LL)(n-r+)*(LL)(m-r+);///注意使用 long long 存储

        memset(add, , sizeof(add));
        Calculate_R_Array(n, r);
        memset(add, , sizeof(add));
        Calculate_C_Array(m, r);

        s.insert(make_pair(n/+, m/+));
        que.push(NODE(n/+, m/+, (+]*R[n/+])/(double)tot));
        ;
        while(k--){
            NODE T = que.top();
            que.pop();
            ans += T.P;
            ; i<; i++){///向四个点扩散
                int newr = T.row + dr[i];
                int newc = T.col + dc[i];
                if(bound(newr, newc)) continue;
                if(!s.count(make_pair(newr, newc))){
                    s.insert(make_pair(newr, newc));
                    que.push(NODE(newr, newc, (double)(C[newc]*R[newr])/(double)tot));
                }
            }
        }
        printf("%.9f\n", ans);
    }
    ;
}

Codeforces 912D Fishs ( 贪心 && 概率期望 && 优先队列 )的更多相关文章

  1. Codeforces 912D Fishes (概率&期望,优先队列的应用)

    题目链接 Fishes 题意  在一个$n*m$的矩阵中,随机选择一个$r * r$的区域覆盖. 一开始我们可以在这个$n*m$的矩阵中选择$k$个点标记为$1$. 我们要选择一个最佳的标记策略,使得 ...

  2. CF605E Intergalaxy Trips 贪心 概率期望

    (当时写这篇题解的时候,,,不知道为什么,,,写的非常冗杂,,,不想改了...) 题意:一张有n个点的图,其中每天第i个点到第j个点的边都有$P_{i, j}$的概率开放,每天可以选择走一步或者留在原 ...

  3. CF623D birthday 贪心 概率期望

    题意:n个人,玩抓人游戏,每抓住一个人都要猜这个人是谁.对于每一局,第i个人有$p_{i}$的概率被抓到.游戏结束当且仅当每个人都在某局中被抓到并且猜中自己的名字,求一个合适的策略来使得期望游戏局数最 ...

  4. luoguP3232 [HNOI2013]游走 贪心 + 概率期望 + 高斯消元

    首先,题目中的无向简单连通图代表着没有自环,重边... 总分的期望 = 每条边的期望之和...................每条边的期望又可以拆成$u \to v$的期望和$v \to u$的期望 ...

  5. Codeforces 1045D Interstellar battle 概率期望

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF1045D.html 题目传送门 - CF1045D 题意 给定一棵有 $n$ 个节点的树,第 $i$ 个节点 ...

  6. Codeforces - 1264C - Beautiful Mirrors with queries - 概率期望dp

    一道挺难的概率期望dp,花了很长时间才学会div2的E怎么做,但这道题是另一种设法. https://codeforces.com/contest/1264/problem/C 要设为 \(dp_i\ ...

  7. CodeForces - 28C Bath Queue 概率与期望

    我概率期望真是垃圾--,这题搞了两个钟头-- 题意 有\(n\)个人,\(m\)个浴室,每个浴室里有\(a_i\)个浴缸.每个人会等概率随机选择一个浴室,然后每个浴室中尽量平分到每个浴缸.问期望最长排 ...

  8. [Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT)

    [Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT) 题面 给出一个\(n\)个点\(m\)条边的有向图(可能有环),走每条边需要支付一个价格\(c_i ...

  9. 【BZOJ3143】【HNOI2013】游走 && 【BZOJ3270】博物馆 【高斯消元+概率期望】

    刚学完 高斯消元,我们来做几道题吧! T1:[BZOJ3143][HNOI2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小 ...

随机推荐

  1. Studio 3T 破解教程

    亲测可用 ,且小编一直在使用 1.创建文件studio3t.bat 并将下面这段内容复制 @echo off ECHO 重置Studio 3T的使用日期...... FOR /f "toke ...

  2. mysql分表规则(转)

    author:skatetime:2013/05/14 Mysql分表准则 在大量使用mysql时,数据量大.高访问时,为了提高性能需要分表处理,简介下mysql分表的标准,后续会继续补充 环境:业务 ...

  3. 如何根据对象的属性,对集合(list / set)中的对象进行排序

      一:针对list 通过java.util.Collections的sort方法,有2个参数,第一个参数是list对象,第二个参数是new Comparator<对象类>(){}方法,这 ...

  4. CodeForces-431D Random Task

    题目描述 求一个\(n\),使得\(n+1\)到\(2n\)这些数的二进制中恰好有\(k\)个\(1\)的数有\(m\)个. Input 输入包含两个正整数\(m,k\).$(0<=m<= ...

  5. 数位dp(不要62)

    http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求区间内满足以下条件的数量 1.数位不能出现4,2.任意两相邻数位不能是62. 解法:数位dp[po ...

  6. php开发环境推荐使用

    万丈高楼平地起,好用得环境才能建立宏伟大厦,php开发环境推荐使用 1,自己安装 lamp 环境 linux+apache+mysql+php 2,自己安装 lnmp 环境 linux+nginx+m ...

  7. win10删除文件夹时需要管理员授权或拒绝访问(无权访问权限修改)

    win10 用户:我自己就是电脑主人,凭啥我没有自己电脑文件夹的权限? 微软:对不起,您是电脑硬件的主人,但是电脑系统的主人是我!你只不过是个用户而已. win10 用户:我cao你...[哔-] 对 ...

  8. Arm宣布将在Linux中应用事务内存扩展支持

    事务内存扩展是Arm对硬件事务内存的支持,用于改进对大型共享数据结构的并发访问. 在宣布事务性内存扩展和可伸缩向量扩展2时,Arm表示他们将很快为GNU工具链和LLVM提供支持.正如我们已经看到的,为 ...

  9. Java学习01-使用maven插件tomcat搭建web maven项目

    我使用社区版的IDEA,社区版的没有tomcat插件,只能使用maven插件进行tomcat的使用了,下面进入正题 一.pom.xml配置tomcat插件 <build> <fina ...

  10. bootstrap-table.min.js不同版本返回分页参数不同的问题

    1.使用公司用的bootstrap-table.min.js ,刚开始bootstrap-table分页参数是这么写的 分页查询参数: 后端代码为: Result返回类的参数为list,以及total ...