codeforce 551C GukiZ hates Boxes
2015-07-17 15:09
351 查看
题意:在一条直线上有n个点,每个点上有不同数量箱子阻挡教授的道路,他有m个学生,每个学生每秒只能般一个箱子或移动右边一位,开始m个学生都在左边0点,开始向右边搬走箱子,问多少秒可以把所有箱子搬没。
也是在满足题意的条件下进行二分,我也发现二分的题难不是在于二分难写(标准的二分,注意左右边界),在于看出来这是二分和对条件judge()的写法,这题judge(),….开始 各种麻烦的模拟 还是没能成功写出。。。。妈蛋 我太弱了。。。最后还是。。。看别人题解写出来的。。。。
也是在满足题意的条件下进行二分,我也发现二分的题难不是在于二分难写(标准的二分,注意左右边界),在于看出来这是二分和对条件judge()的写法,这题judge(),….开始 各种麻烦的模拟 还是没能成功写出。。。。妈蛋 我太弱了。。。最后还是。。。看别人题解写出来的。。。。
[code]#include<cstdio> #include<iostream> #include<cstring> using namespace std; long long dist[100010],n,m,tot; int judge(long long x) { int cnt = m; long long s = 0; for(int i = 1; i<=tot; i++) { s+=dist[i]; while(s+i>=x)//移动箱子加移动路程的总时间超过了x { s-=x-i;//对于已走的路程i,那么一个人有x-i个时间来搬箱子,所以每增加一人,时间消耗可以减少x-i cnt--; if(cnt<0) return 0; } } if(cnt==0) return s<=0; return 1; } int main() { while(~scanf("%d %d",&n,&m)) { long long sum=0; for(int i=1;i<=n;i++){ scanf("%d",&dist[i]); sum+=dist[i]; if(dist[i]) tot=i; } int l=tot,r=tot+sum; while(l<r) { int mid=l+(r-l)*0.5; if(judge(mid)) { r=mid; } else l=mid+1; } printf("%d\n",r); } }
相关文章推荐
- hdu 1513 Palindrome(LCS)
- 基于C/C++的读取文件夹下所有文件(图片、文档等)的代码
- [delphi技术]Delphi常见图象格式转换技术
- 弟弟的作业
- IOS中的模糊效果
- C#异步执行任务的方法
- snmpd占用CPU过高
- ChildActionOnly和ActionName的用法
- dd大牛的背包九讲
- Cisco Packet Tracer6.0安装及汉化
- 本人为巨杉数据库(开源NoSQL)写的C#驱动,支持Linq,全部开源,已提交github
- C# 百度语音合成
- jQuery EasyUI实现全部关闭tabs
- Suppress user properties/ custom fields when print in Outlook
- 自己写的类似UITextView的类,实现UIKeyInput协议
- ios 程序后台运行
- java 利用系统WinRAR解压缩(zip/rar压缩文件)
- 改进Spring中的分页技术
- 南邮的面积
- Android调用系统摄像头拍照并剪裁压缩