B

题意:
就是给你n个压力,然后有m个人可以去承担,每个人只能承担一个,现在问你如何去分配这m个人。使得这m个人的压力方差最小。

思考:
刚开始我还以为是压力的方差最小,害,区域赛的题目确实都很难懂。然后题目保证了m>=n,刚开始由于我读错了,所以直接对于每个压力排序后,从后面开始尽量让当前值和va[1]一样,题意错了就不说了。那么既然保证了m>=n,很明显每个压力可以先分配一个人,然后剩下的人怎么分配?,发现对于每个压力对答案的贡献就是(当前的压力-所有人压力的平均值)✖这个压力的人数。由于平均压力是定值。所以用一个单调队列,结构体的排序按,如果这个压力增加一个人,可以让方差更小,那么就给他加一个人,就这样贪心m-n即可。最后遍历对列,把每个压力对答案的贡献算上,最后别忘记了除以m,方差的公式。
值得注意的是,虽然给了3秒,但是队列的取出和放入也是很占时间的,所以这题还卡cin和ll,所以尽量用scanf和int吧。

代码:

int T,n,m,k;
db va[N];
db sum,ans;struct node{int a,b; //那个压力,有多少人db c; //平均每个人的压力friend operator < (node A,node B){db t1 = (A.c-sum)*(A.c-sum)*A.b; //不加人对答案的贡献db t2 = (va[A.a]/(A.b+1)-sum)*(va[A.a]/(A.b+1)-sum)*(A.b+1); //加人对答案的贡献db t3 = (B.c-sum)*(B.c-sum)*B.b;db t4 = (va[B.a]/(B.b+1)-sum)*(va[B.a]/(B.b+1)-sum)*(B.b+1);db x1 = t1-t2,x2 = t3-t4; //尽量让差大的去加人return x1<x2;}
};signed main()
{IOS;scanf("%d",&T);priority_queue<node> q;for(int cs=1;cs<=T;cs++){sum = ans = 0;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%lf",&va[i]);for(int i=1;i<=n;i++) sum += va[i];sum /= m; //m个人的压力平均值for(int i=1;i<=n;i++) q.push({i,1,va[i]});int last = m-n;while(last--){auto now = q.top();q.pop();q.push({now.a,now.b+1,va[now.a]/(now.b+1)}); //让最优的去加人}while(q.size()){auto now = q.top();q.pop();ans += (now.c-sum)*(now.c-sum)*now.b; //贡献*人数}ans /= m;printf("Case #%d: %.8lf\n",cs,ans);}return 0;
}

总结:
多多积累经验呀,多多思考,队列是个贪心的好方法。

2017EC-Scapegoat-(思维+优先队列贪心)相关推荐

  1. LeetCode 1642. 可以到达的最远建筑(二分查找 / 优先队列贪心)

    文章目录 1. 题目 2. 解题 2.1 二分查找 2.2 优先队列+贪心 1. 题目 给你一个整数数组 heights ,表示建筑物的高度.另有一些砖块 bricks 和梯子 ladders . 你 ...

  2. 【CF 732E】Sockets(优先队列+贪心)

    [CF 732E]Sockets(优先队列+贪心) 题目大意: n台电脑,m个供电器. 每台电脑和每个供电器都有电量,当电脑i的电量和供电器j电量相同时,可以连接供电. 现在提供变压器,可以连接到供电 ...

  3. POJ3614Sunscreen(优先队列+贪心)

    Sunscreen Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8435   Accepted: 2981 Descrip ...

  4. *【HDU - 5711】Ingress(tsp旅行商问题,优先队列贪心,状压dp,floyd最短路,图论)

    题干: Brickgao, who profited from your accurate calculating last year, made a great deal of money by m ...

  5. LeetCode 1199. 建造街区的最短时间(优先队列贪心)

    文章目录 1. 题目 2. 解题 1. 题目 你是个城市规划工作者,手里负责管辖一系列的街区.在这个街区列表中 blocks[i] = t 意味着第 i 个街区需要 t 个单位的时间来建造. 由于一个 ...

  6. hdu 4544 优先队列+贪心

    题意:最近,减肥失败的湫湫为发泄心中郁闷,在玩一个消灭免子的游戏. 游戏规则很简单,用箭杀死免子即可. 箭是一种消耗品,已知有M种不同类型的箭可以选择,并且每种箭都会对兔子造成伤害,对应的伤害值分别为 ...

  7. 51Nod - 1475 优先队列 + 贪心

    题意: 小C现在想建设一个国家.这个国家中有一个首都,然后有若干个中间站,还有若干个城市. 现在小C想把国家建造成这样的形状:选若干(可以是0个)的中间站把他们连成一条直线,然后把首都(首都也是一个中 ...

  8. 贪心 ---- Educational Codeforces Round 90 (Rated for Div. 2)E. Sum of Digits[数位贡献+思维题+贪心]

    题目链接 题目大意:就是给你nnn和kkk然后再定义一个函数f(x)是十进制数x各个位数之和f(x)是十进制数x各个位数之和f(x)是十进制数x各个位数之和 叫你求出最小的x使得f(x)+f(x+1) ...

  9. poj 3614 Sunscreen(优先队列+贪心)

    Description To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must cover her ...

  10. hdu6000 Wash 思维、贪心

    hdu6000 题意:有 L件衣服,n 个洗衣机,m 个烘干机.一台机器一次只能用于一件衣服,且每工作一次花费一定的时间.问洗完且烘干所有衣服最少要多久. tags:好难想到.. 如果只用洗衣机那很好 ...

最新文章

  1. CVPR2020论文解析:视频语义检索
  2. 数据库性能优化—主从分离
  3. 在linux中编写shell脚本文件,如何编写简单的Shell脚本(Script)文件之Linux的基本操作...
  4. C#中异步多线程的常见用法
  5. 流程型企业SCM、ERP、MES、PCS如何集成?
  6. jquery类操作和className的区别
  7. hduoj 2602Bone Collector
  8. 使用spring ioc基于纯xml配置模拟crud
  9. 10-Python-mapfilter
  10. ESPRESSIF AT指令集
  11. android放大镜无广告,放大镜微件  |  Android 开发者  |  Android Developers
  12. 使用Python写一个m3u8多线程下载器
  13. PHP中用while的用法,php while语句的用法
  14. Android攻城狮Dialog
  15. 【学习记录贴16】cesium进行三维发布
  16. CENTOS上的网络安全工具(二)ARKIME部署安装
  17. Vector CANoe修改Panel的名字
  18. 亳州市发明专利申请费用多少钱,权利要求书要怎么写?
  19. csdn里的KaTex 公式语法
  20. Win10家庭版实现远程桌面 RDPWraper -解决not supported ,not listening问题

热门文章

  1. iir滤波器的基本网络结构_(IIR)滤波器的基本结构-Read.ppt
  2. RSS阅读器FeedDemon使用方法
  3. 小朋友适合读增广贤文么,增广贤文适合多大的孩子看?
  4. 对接有道翻译api中英翻译软件
  5. 中文信息杂志中文信息杂志社中文信息编辑部2022年第6期目录
  6. 跨境电商:YouTube视频营销必看攻略
  7. 计算机数学位数,有效位数
  8. Android 第三方应用广告拦截实现
  9. win7升级win10失败开不了机
  10. python cad按范围裁剪