poj3258解题报告
2015-06-14 15:22
330 查看
这是一道二分的题目,题目大概意思:一些石头排成一条线,第一个和最后一个不能去掉,其余的共可以去掉m块,要使去掉后石头间距的最小值达到最大。
没想到思路。。。。去看的别人的思路
统计当前中界mid为最小间距的情况下下,要丢多少个石头,然后在与m比较,相应的改变上下界
注意就是m与中界丢的石头数相等时,也不一定是最小距离,需要继续比较(因为不是mid直接和m比较,想想为什么!!)
14293038 h123120 3258 Accepted 432K 407MS C++ 1022B 2015-06-14 15:02:37
没想到思路。。。。去看的别人的思路
统计当前中界mid为最小间距的情况下下,要丢多少个石头,然后在与m比较,相应的改变上下界
注意就是m与中界丢的石头数相等时,也不一定是最小距离,需要继续比较(因为不是mid直接和m比较,想想为什么!!)
14293038 h123120 3258 Accepted 432K 407MS C++ 1022B 2015-06-14 15:02:37
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; int l,n,m; int main() { while(cin>>l>>n>>m) { int* dist=new int[n+2]; dist[0]=0; dist[n+1]=l; int low=l; int high=l; for(int i=1; i<=n; i++) cin>>dist[i]; sort(dist,dist+n+2); for(int i=1; i<=n+1; i++) { low=min(low,dist[i]-dist[i-1]); } while(low<=high) { int mid=(high+low)/2; int s_cnt=0,d_cnt=0; for(int i=1; i<=n+1;)//统计以当前mid的为最小长度,要丢多少个石头 { if((d_cnt+=dist[i]-dist[i-1])<=mid) { s_cnt++; i++; } else { i++; d_cnt=0; } } if(s_cnt<=m) low=mid+1;//正确的值在low这边 ,等于但mid不一定是最大 else high=mid-1; } cout<<low<<endl; delete dist; } }
相关文章推荐
- NSSet练习
- Win7+ubuntu kylin+CentOS 6.5三系统安装图文教程
- 1037: [ZJOI2008]生日聚会Party
- Leetcode 104 Maximum Depth of Binary Tree
- 网络安全初探
- 单例模式——探索之旅
- 【java】itoo项目实战之常被忽视的性能优化
- 图书馆管理系统面向对象编程
- JQuery
- Altium Designer 6.9报错:Unknow Pin的解决方法 分类: electronic 2015-06-14 15:19 10人阅读 评论(0) 收藏
- [leetcode 14]Longest Common Prfix
- 发现问题 解决问题:好用的OneNote插件Onetastic
- [leetcode] Invert Binary Tree
- Find Peak Element
- Hibernate3学习笔记(4)——Hibernate查询技术之HQL语句
- SGU134 Centroid
- hdu 1054 Strategic Game 【匈牙利算法】
- 如何使用Hadoop的JobControl
- VS调试无法进入DLL中断点解决方法
- 国内外研究主页集合:计算机视觉-机器学习-模式识别