Codeforces 912D - Fishes
传送门:http://codeforces.com/contest/912/problem/D
本题是一个概率问题——求数学期望。
在一个n×m的方格中,有k个“*”。每个格子里可能有0~1个“*”。现有一个r×r的网,将网随机投入方格中,求解:网内“*”个数的数学期望的最大值。
首先考虑所求的数学期望:
枚举所有的投网方式,则对于方格的任意格子(x,y),均可以定义其被网覆盖的次数cnt(x,y)。
若第i个“*”的位置为(xi,yi),则此网覆盖第i个“*”的次数为cnt(xi,yi),则所求期望为:$ans=\frac{\sum_{i=1}^{k} {cnt(x_i , y_i)}}{tot}$。其中,tot为投网的方法数,tot=(n-r+1)(m-r+1)。
这个问题的关键在于:求解一种“*”在方格内的放置方法,使得所求期望最大。
于是,可以考虑从方格中间的位置出发,通过BFS,寻找“*”的位置。于是,为BFS构造一个队列。由于本题需要求解最大值,所以每一次,均取cnt值最大的点作为当前步搜索的起点(于是这里用到优先队列std::priority_queue)。一步搜索向周围(U/D/L/R)推进一个格子。同时,应维护vis(x,y),即点(x,y)是否被访问(根据本题的数据范围,请使用std::map)。进行k步搜索,每一步确定一个“*”的坐标。
参考程序如下:
#include <bits/stdc++.h>
using namespace std; int n, m, r, k;
priority_queue<pair<int64_t, int64_t> > q;
map<int64_t, bool> vis; int64_t pair2int(pair<int, int> p)
{
return 1LL * m * p.first + p.second;
} pair<int, int> int2pair(int64_t p)
{
return make_pair(p / m, p % m);
} int64_t cnt(pair<int, int> p)
{
int x = p.first;
int y = p.second;
int dx = min(n, x + r) - max(r - , x);
int dy = min(m, y + r) - max(r - , y);
return 1LL * dx * dy;
} int main(void)
{
scanf("%d%d%d%d", &n, &m, &r, &k);
pair<int, int> s = make_pair(n / , m / );
q.push(make_pair(cnt(s), pair2int(s)));
vis[pair2int(s)] = true;
int64_t sum = 0LL;
int64_t tot = 1LL * (n - r + ) * (m - r + );
int dx[] = {-, , , };
int dy[] = {, , -, };
while (k--) {
sum += q.top().first;
pair<int, int> cur = int2pair(q.top().second);
q.pop();
for (int i = ; i < ; i++) {
int x = cur.first + dx[i];
int y = cur.second + dy[i];
if (x < || x >= n || y < || y >= m) continue;
pair<int, int> p = make_pair(x, y);
if (vis[pair2int(p)]) continue;
q.push(make_pair(cnt(p), pair2int(p)));
vis[pair2int(p)] = true;
}
}
double ans = 1.0 * sum / tot;
printf("%.10f\n", ans);
return ;
}
Codeforces 912D - Fishes的更多相关文章
- CodeForces 912d fishes(优先队列+期望)
While Grisha was celebrating New Year with Ded Moroz, Misha gifted Sasha a small rectangular pond of ...
- Codeforces 912D Fishes (概率&期望,优先队列的应用)
题目链接 Fishes 题意 在一个$n*m$的矩阵中,随机选择一个$r * r$的区域覆盖. 一开始我们可以在这个$n*m$的矩阵中选择$k$个点标记为$1$. 我们要选择一个最佳的标记策略,使得 ...
- Codeforces 912D Fishs ( 贪心 && 概率期望 && 优先队列 )
题意 : 给出一个 N * M 的网格,然后给你 K 条鱼给你放置,现有规格为 r * r 的渔网,问你如果渔网随意放置去捕捞小鱼的情况下,捕到的最大期望值是多少? 分析 : 有一个很直观的想法就是 ...
- Codeforces Round #456 (Div. 2) 912D D. Fishes
题: OvO http://codeforces.com/contest/912/problem/D 解: 枚举每一条鱼,每放一条鱼,必然放到最优的位置,而最优位置即使钓上的概率最大的位置,即最多的r ...
- Codeforces 912 D. Fishes (贪心、bfs)
题目链接:Fishes 题意: 有一个n×m的鱼塘,有一张r×r的渔网,现在往池塘里面放k条鱼(每个格子只能放一条鱼), 现在撒网的地方是随机的(必须在池塘内),问能捕的鱼的期望值最大是多少? 题解: ...
- Codeforces Round #456 (Div. 2)
Codeforces Round #456 (Div. 2) A. Tricky Alchemy 题目描述:要制作三种球:黄.绿.蓝,一个黄球需要两个黄色水晶,一个绿球需要一个黄色水晶和一个蓝色水晶, ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
随机推荐
- Ubuntu环境下安装nodejs和npm
1.安装python-software-properties sudo apt-get install python-software-properties 2.添加ppa curl -sL http ...
- [SCOI 2010] 连续攻击游戏
[题目链接] https://www.luogu.org/problemnew/show/P1640 [算法] 二分图匹配 实现时需要常数优化和特判 [代码] //code by byf and lm ...
- cf2.25
T1 题意:判断给出的数中有多少不同的大于的数. content:傻逼题,5min手速 T2 题意:给出p.y,输出y~p+1中最大一个不是2-p的倍数的数. content:答案很简单,但是很难想到 ...
- 【高德地图API】注册密钥
能正常使用高德地图API所有功能的前提是添加了密钥.高德API官网地址:http://api.amap.com/ 注册步骤:1.注册账号 2.填写开发者信息 3.注册密钥 1.注册账号(略过) 2.填 ...
- Flink之Window Operation
目录 Configuring Time Characteristics Process Functions Window Operators Applying Functions on Windows ...
- Secure CRT中解决vim高亮设置的方法
此文主要是解决vim编程中高亮显示的.原因是: 1.默认情况下,SecureCRT是有自己的终端显示颜色.这样在我们编程中不利于阅读内容. 2.我们必须到Linux系统中进行改进才能真正解决这样的问题 ...
- activiti安装-------安装插件
对上面的放大
- 让谷歌浏览器(chrome)保存调试代码workspace
方法/步骤 chrome浏览器早期版本的操作方法与我现在要讲的方法有所不同,因此操作前请注意浏览器的版本号. 示例中的版本号: 53.0.2785.116 m 任意打开一个需要调试的html文件 ...
- Sublime Text Version 3.0,Build3143注册码
1.打开sublime text软件2.Help->Enter License3.复制以下BEGIN LICENSE和END LICENSE之间的部分,粘贴进去.(注意:不要复制BEGIN LI ...
- 暴力(python)
输出由1,2,3,4组成的互不相同且无重复的三位数! #方式一 lst = ['1', '2', '3', '4'] res = [] for i in lst: for j in lst: for ...