博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
E. 玩游戏
阅读量:4321 次
发布时间:2019-06-06

本文共 1303 字,大约阅读时间需要 4 分钟。

E. 玩游戏

运行时间限制: 1000 运行内存限制: 65536
作者: scsyuanbaoku 是否specialjudge: False

题目描述

你正在玩一款新的游戏,在游戏中你有N个用于给你的战士补充能量的道具和M个战士。这N个道具都有一个能量值,代表该道具能给战士提供的总能量,给战士补充后该值会永久减少,该值为0后该道具就没有用了。例如某道具的能量值为500,如果用它给一个战士补充了300的能量,则该道具的能量值变为200。现在你要带领你的战士们出征了,在出征前你要给这M个战士补充能量。假设初始时每个战士的能量都为0,补充完后所有的战士的能量都一样。如果一个战士在补充能量时只能使用1个道具(1个道具可以给若干个战士补充能量)。现在请你写一段程序来计算一下,你最大能给每个战士补充的能量值是多少?

输入:
第一行为2个整数,分别代表N(1<=N<=10000)和M(1<=M<=20000)
第二行为N个整数,代表这N个道具能提供的能量值(所有能量值大于等于100且小于等于2000000)。
输出:
为一个整数,代表你最大能给每个战士补充的能量值。测试数据保证有解。

输入样例

5 13765 506 483 329 492

输出样例

164
解法:
我们可以反转思路,假设我给定一个值x,那么是不是能是每个战士的能量都到达这个值呢?用ai表示第i个能量块的能量,如果sum(floor(ai/x))>=n ,1<=i<=m(sum表示求和,floor表示向下取整),就说明可以,如果<n则不行floor(ai/x)是求出这个能量块能给几个战士补充能量。
然后我们发现答案还有一个性质就是加入x可行,那么如果y<x,x一定也可行;假如x不可行,那么如果y>x,y也一定不可行。所以我们想到答案一定是在某一个点发生了突变,x可行,x+1不可行、
此时的x也就是答案了。
所以此时采用二分的方法,设一个l,一个r
满足l<=ans,r>ans
此时我们计算出mid=(l+r)/2
如果mid可行那么l=mid;
如果不可行,那么r=mid;
知道l=ans,r=ans+1
(判断条件为r-l==1)
#include
#include
int a[10005],m,n,mx;bool f(int z){ int s=0; for(int i=1;i<=n;++i) s+=a[i]/z; return m<=s;}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i){ scanf("%d",&a[i]); if(a[i]>mx) mx=a[i]; } int l=0,r=mx+1; while(l

 

转载于:https://www.cnblogs.com/bzmd/p/10202099.html

你可能感兴趣的文章
使用缓存的9大误区(下)转载
查看>>
appium键值对的应用
查看>>
MyEclipse 8.X 通用算法
查看>>
selenium.Phantomjs设置浏览器请求头
查看>>
分布式数据库如何选择,几种分布式数据库优缺点一览
查看>>
BZOJ 4443: 小凸玩矩阵【二分图】
查看>>
苹果 OS X制作u盘启动盘
查看>>
Jquery便利对象
查看>>
MVC: Connection String
查看>>
idea常用设置汇总
查看>>
Node.SelectNodes
查看>>
Lambda表达式语法进一步巩固
查看>>
Vue基础安装(精华)
查看>>
Git 提交修改内容和查看被修改的内容
查看>>
PAT - 1008. 数组元素循环右移问题 (20)
查看>>
请求出现 Nginx 413 Request Entity Too Large错误的解决方法
查看>>
配置php_memcache访问网站的步骤
查看>>
hibernate的id生成策略
查看>>
树莓派3B+学习笔记:5、安装vim
查看>>
[Spfa][bfs] Jzoj P5781 秘密通道
查看>>