传送门: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 ;
}

最新文章

  1. 一道常被人轻视的前端JS面试题
  2. 重拾Blog
  3. Date get period
  4. Linux 组群账户管理
  5. js-二维数组和多维数组
  6. USACO 2013 November Contest Gold 简要题解
  7. Win7激活后添加grub引导Linux最简单方法
  8. php数组内容分页的例子(转)
  9. java se 6在solaris的可观察性特征分析
  10. Cocos2d-x v3.0正式版尝鲜体验【3】 Label文本标签
  11. HTML5 拖拽效果实现
  12. UserManager
  13. 为UWP应用开启回环访问权限
  14. Java DualPivotQuickSort 双轴快速排序 源码 笔记
  15. CentOS切换为iptables防火墙并进行相关配置
  16. centos离线安装docker及其它软件包
  17. calico 排错记录 apt-get install telnet
  18. Solr学习之一 --------环境搭建
  19. 使用vue-cli结合express获取mongodb里面的数据
  20. http 错误代码解释 &amp;&amp; nginx 自定义错误【转】

热门文章

  1. C++中switch 语句中的变量声明和
  2. Linux音频驱动-ALSA概述
  3. 【WIP】Rails&#160;Client&#160;Side&#160;Document
  4. Knights of the Round Table(Tarjan+奇圈)
  5. Appium + python - weixin公众号操作
  6. Bitmap与String之间的转换
  7. 【洛谷2904/BZOJ1617】[USACO08MAR]跨河River Crossing(动态规划)
  8. sqlyog注册码激活
  9. Java系列学习(五)-流程控制语句
  10. 程序员的幽默-献给所有Java程序员