传送门: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步搜索,每一步确定一个“*”的坐标。

参考程序如下:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int n, m, r, k;
  5. priority_queue<pair<int64_t, int64_t> > q;
  6. map<int64_t, bool> vis;
  7.  
  8. int64_t pair2int(pair<int, int> p)
  9. {
  10. return 1LL * m * p.first + p.second;
  11. }
  12.  
  13. pair<int, int> int2pair(int64_t p)
  14. {
  15. return make_pair(p / m, p % m);
  16. }
  17.  
  18. int64_t cnt(pair<int, int> p)
  19. {
  20. int x = p.first;
  21. int y = p.second;
  22. int dx = min(n, x + r) - max(r - , x);
  23. int dy = min(m, y + r) - max(r - , y);
  24. return 1LL * dx * dy;
  25. }
  26.  
  27. int main(void)
  28. {
  29. scanf("%d%d%d%d", &n, &m, &r, &k);
  30. pair<int, int> s = make_pair(n / , m / );
  31. q.push(make_pair(cnt(s), pair2int(s)));
  32. vis[pair2int(s)] = true;
  33. int64_t sum = 0LL;
  34. int64_t tot = 1LL * (n - r + ) * (m - r + );
  35. int dx[] = {-, , , };
  36. int dy[] = {, , -, };
  37. while (k--) {
  38. sum += q.top().first;
  39. pair<int, int> cur = int2pair(q.top().second);
  40. q.pop();
  41. for (int i = ; i < ; i++) {
  42. int x = cur.first + dx[i];
  43. int y = cur.second + dy[i];
  44. if (x < || x >= n || y < || y >= m) continue;
  45. pair<int, int> p = make_pair(x, y);
  46. if (vis[pair2int(p)]) continue;
  47. q.push(make_pair(cnt(p), pair2int(p)));
  48. vis[pair2int(p)] = true;
  49. }
  50. }
  51. double ans = 1.0 * sum / tot;
  52. printf("%.10f\n", ans);
  53. return ;
  54. }

Codeforces 912D - Fishes的更多相关文章

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

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

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

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

  3. Codeforces 912D Fishs ( 贪心 && 概率期望 && 优先队列 )

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

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

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

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

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

  6. Codeforces Round #456 (Div. 2)

    Codeforces Round #456 (Div. 2) A. Tricky Alchemy 题目描述:要制作三种球:黄.绿.蓝,一个黄球需要两个黄色水晶,一个绿球需要一个黄色水晶和一个蓝色水晶, ...

  7. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  8. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  9. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

随机推荐

  1. 浅析js的函数的按值传递参数

    js的函数传参的方式是按值传递,正常情况下,改变函数参数的值,并不会对函数外部的变量造成影响.例如: 'use strict';var list = [1, 2, 3]; list.forEach(f ...

  2. YTU 2715: 函数---判断某年某月某日是这一年中的第几天

    2715: 函数---判断某年某月某日是这一年中的第几天 时间限制: 1 Sec  内存限制: 128 MB 提交: 380  解决: 155 题目描述 在主程序(main)中输入某年某月某日,例如2 ...

  3. C# 获得资源文件下图片的路径

    最终实现正确的代码是: button8.Image = System.Drawing.Image.FromFile(@"..\\..\\Resources\\GAOJIBAN.png&quo ...

  4. codeforces 764D

    脑洞 很早以前没有补掉的题目 四色问题肯定使有解的,然后就是怎么构造.注意到边长是奇数,那么我们就可以分类,按左上角坐标的奇偶性分类,正好对应四种颜色.因为当两个矩形左上角横纵坐标奇偶性不同时,那么肯 ...

  5. 【转载】基于AFNetWorking3.0的图片缓存分析

    原文出处: Yasin的简书 理论 不喜欢理论的可以直接跳到下面的Demo实践部分 缓存介绍 缓存按照保存位置可以分为两类:内存缓存.硬盘缓存(FMDB.CoreData…).我们常说的网络请求缓存包 ...

  6. jsp中的setHeader页面跳转备忘录

    1 <!-- response.setHeader("refresh","3;url=你想跳的页面")--> <%-- response.se ...

  7. 14款形态各异的超时尚HTML5时钟动画

    14款超时尚的HTML5时钟动画(附源码)   时钟动画在网页应用中也非常广泛,在一些个人博客中,我们经常会看到一些相当个性化的HTML5时钟动画.今天我们向大家分享了14款形态各异的超时尚HTML5 ...

  8. [Swift通天遁地]二、表格表单-(10)快速添加日期选择/多选/动作表单/地图等自定义表单

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  9. 【题解】永无乡 [HNOI2012] [BZOJ2733] [P3224]

    [题解]永无乡 [HNOI2012] [BZOJ2733] [P3224] [题目描述] 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要 ...

  10. 吝啬的国度 ---用vector 来构图

    根据题目可以看出来  有n 个城市 只有 n-1  条路线 那么  就可以确定这个图中  不存在 圆  所以从一个点到另一个点 只有一条唯一的路  所以从一个节点到另一个节点 那么 这个节点只有一个唯 ...