题目链接:http://codeforces.com/contest/912/problem/D

题目大意:

  在一个\(n \times m\)的网格中放鱼(每个网格只能放一条鱼),用一个\(r \times r\)的网随机地捕一次鱼,问如何放置鱼能使得捕到的鱼的期望值最大,求最大值。

知识点:  优先队列、概率与期望

解题思路:

  要使捕到鱼的期望值最大,就应该往最有可能被渔网捞到的格子里放鱼。

  \(P(某个格子被捞到)= N_1(渔网能捞到这个格子的放置方案数)/N_2(渔网总放置方案数),\)

  \(N(渔网总放置方案数) = (n-r+1)\times(m-r+1)\)

  而要求\(N_1\),我们可以先算出最左边一列和最上边一行的各个格子对应的\(N_1\),\(N_1(x,y) = N_1(x,0) \times N_1(0,y)\)。于是我们可以从最中间的格子开始(直觉告诉我们:最中间的格子总是最有可能被捞到),用一个优先队列维护,每次都往上下左右四个方向拓展,找出前 \(k\) 个最有可能被捞到的位置所对应的期望值,加起来所得到的总和即为答案。

AC代码:

 #include <bits/stdc++.h>

 using namespace std;
const int maxn = 1e5+;
const int cx[]={,-,,},cy[]={,,,-}; int line[maxn],col[maxn];
struct node{
int x,y;
double z;
friend bool operator <(const node &a,const node &b){
return a.z<b.z;
}
};
map<pair<int,int>,int> vis;
priority_queue<node> q; int main(){
int n,m,r,k;
scanf("%d%d%d%d",&n,&m,&r,&k);
for(int i=;i<=(n+)/;i++){
if(i<=n-r+) line[i]=min(i,r);
else line[i]=line[i-];
}
for(int i=n,j=;i>(n+)/;i--,j++)
line[i]=line[j]; for(int i=;i<=(m+)/;i++){
if(i<=m-r+) col[i]=min(i,r);
else col[i]=col[i-];
}
for(int i=m,j=;i>(m+)/;i--,j++)
col[i]=col[j]; double tot=(double)(n-r+)*(m-r+),ans=0.0;
node now,next;
now.x=(n+)/,now.y=(m+)/;
now.z=(double)line[now.x]*col[now.y]/tot;
q.push(now);
vis[make_pair(now.x,now.y)]=;
while(k--){
now=q.top();
q.pop();
ans+=now.z;
for(int i=;i<;i++){
int nx=now.x+cx[i],ny=now.y+cy[i];
if(nx>&&nx<=n&&ny>&&ny<=m&&!vis[make_pair(nx,ny)]){
next.x=nx,next.y=ny,next.z=(double)line[next.x]*col[next.y]/tot;
q.push(next);
vis[make_pair(nx,ny)]=;
}
}
}
printf("%.10lf\n",ans); return ;
}

CF912D Fishes的更多相关文章

  1. CF912D Fishes 期望

    题意翻译 Description 有一个长为nnn ,宽为mmm 的鱼缸,还有一个边长为rrr 的正方形渔网.你可以往鱼缸里放kkk 条鱼,问用渔网随机在浴缸里捞鱼的最大期望是多少.不懂什么是期望的自 ...

  2. [CF912D]Fishes - 求数学期望,乱搞

    D. Fishes time limit per test 1 second memory limit per test 256 megabytes input standard input outp ...

  3. CF912D Fishes 期望 + 贪心

    有趣的水题 由期望的线性性质,全局期望 = 每个格子的期望之和 由于权值一样,我们优先选概率大的点就好了 用一些数据结构来维护就好了 复杂度$O(k \log n)$ #include <set ...

  4. CodeForces 912d fishes(优先队列+期望)

    While Grisha was celebrating New Year with Ded Moroz, Misha gifted Sasha a small rectangular pond of ...

  5. Codeforces 912 D. Fishes (贪心、bfs)

    题目链接:Fishes 题意: 有一个n×m的鱼塘,有一张r×r的渔网,现在往池塘里面放k条鱼(每个格子只能放一条鱼), 现在撒网的地方是随机的(必须在池塘内),问能捕的鱼的期望值最大是多少? 题解: ...

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

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

  7. Codeforces 912D - Fishes

    传送门:http://codeforces.com/contest/912/problem/D 本题是一个概率问题——求数学期望. 在一个n×m的方格中,有k个“*”.每个格子里可能有0~1个“*”. ...

  8. Codeforces Round #456 (Div. 2) 912D D. Fishes

    题: OvO http://codeforces.com/contest/912/problem/D 解: 枚举每一条鱼,每放一条鱼,必然放到最优的位置,而最优位置即使钓上的概率最大的位置,即最多的r ...

  9. cf912D

    题意简述:往n*m的网格中放k条鱼,一个网格最多放一条鱼,然后用一个r*r的网随机去捞鱼,问怎么怎么放鱼能使得捞鱼的期望最大,输出这个期望 题解:肯定优先往中间放,这里k不大,因此有别的简单方法,否则 ...

随机推荐

  1. 《Microduino实战》——2.3 Microduino STM32核心系列

    本节书摘来自华章出版社<Microduino实战>一 书中的第2章,第2.3节,作者:姚琪 杨立斌,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2.3 Mi ...

  2. 源码学习VUE之Observe

    在文章 源码学习VUE之响应式原理我们大概描述了响应式的实现流程,主要写了observe,dep和wather的简易实现,以及推导思路.但相应代码逻辑并不完善,今天我们再来填之前的一些坑. Obser ...

  3. C语言基础知识总结

    知识点的回忆与巩固 一. 条件分支结构 1.if分支语句 2.switch语句 二.循环体部分知识点整理 1.for循环 2.while循环-适合不确定循环次数时使用 三.字符串与数组 数组的操作 1 ...

  4. python selenium(常用关键字)

    1.文本按钮操作相关: send_keys()输入文本 from selenium import webdriver import time dr = webdriver.Chrome() dr.ge ...

  5. 学习HTML

    前端三剑客:HTML.CSS.JavaScript.现在就开始学习HTML啦. 学习资源:http://www.freecodecamp.cn/ 学习笔记: h1,head1,一级标题 <h1& ...

  6. dp (1)

    D - Tree of Tree ZOJ - 3201 这个题目我开始是这么定义的dp[i][j][0] dp[i][j][1] 表示对于第i个节点还有j个的选择 0 代表不选这个节点,1 代表选这个 ...

  7. 【Scala】isInstanceOf 与 classOf的对比,代码+注解简洁明了

    class Animal { } class Cat extends Animal { } object Cat { def main(args: Array[String]): Unit = { / ...

  8. 3D三栅极晶体管(摘抄)

    英特尔的科学家们在2002年发明了三栅极晶体管——这是根据栅极有三面而取名的. 传统“扁平的”2D平面栅极被超级纤薄的.从硅基体垂直竖起的3D硅鳍状物所代替.电流控制是通过在鳍状物三面的每一面安装一个 ...

  9. LabVIEW(数据库自动编号)

    数据库如果字段是自动编号,则在插入数据时,可以不考虑.

  10. Android将库导入到build.gradle

    如图