题目链接: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. Python语言类型

    Python是一门动态解释型的强类型语言. 对这句话进行解析,语言分为动态的和静态的,编译型和解释型的,强类型的和弱类型的语言之分. 下面对三种不同维度的类型的语言进行解释: 1.编译型和解释型 差别 ...

  2. mac OS 安装 Node.js

    打开Node.js官网https://nodejs.org/zh-cn/选择你需要的版本 下载安装 安装完成 输入命令 node -v 查看版本号 输入命令 npm -v 查看版本号

  3. MacBook Pro装Win7后喇叭没有声音

    将MacBook的系统由XP改为Win7 64位后,发现喇叭没有声音了,装了bootcamp并升级到3.2版本都无济于事,google了下,发现还是驱动的问题,Win7下在设备管理器中看到声卡为Hig ...

  4. System Call

    内容 设计系统调用,将系统的相关信息(CPU型号.操作系统的版本号.系统中的进程等类似于Windows的任务管理器的信息)以文本形式列表显示于屏幕,并编写用户程序予以验证. 思想 系统调用是应用程序和 ...

  5. 图论--2-SAT--HDU/HDOJ 4115 Eliminate the Conflict

    Problem Description Conflicts are everywhere in the world, from the young to the elderly, from famil ...

  6. C# 多线程(18):一篇文章就理解async和await

    目录 前言 async await 从以往知识推导 创建异步任务 创建异步任务并返回Task 异步改同步 说说 await Task 说说 async Task 同步异步? Task封装异步任务 关于 ...

  7. 积性函数初步(欧拉$\varphi$函数)

    updata on 2020.4.3 添加了欧拉\(\varphi\)函数为积性函数的证明和它的计算方式 1.积性函数 设\(f(n)\)为定义在正整数上的函数,若\(f(1)=1\),且对于任意正整 ...

  8. Find Minimum in Rotated Sorted Array(旋转数组的最小数字)

    题目描述: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., might become ...

  9. 使用Golang + lua实现一个值班机器人

    我们在的项目组呢,有一项工作是,收邮件(很大程度上使用邮件是为了存个底),然后从我们的系统里边查一下相关信息,然后回复个邮件的工作.虽然工作量并不大,但是会把时间切的稀碎.为了拯救我的时间,所以做了一 ...

  10. while持续输入的几种常用使用方法

    while(scanf("%d,&n")!=EOF) 如果n被成功读入,则返回值为1, 如果n未被成功读入,则返回值为0, 如果遇到错误或遇到end of file,返回值 ...