POJ3258River Hopscotch
来源:互联网 发布:京都 和服 知乎 编辑:程序博客网 时间:2024/05/22 05:24
POJ 3258:
题意:在一段长为L的距离中(1—L),有N个点,去掉其中的M个,使得每个点之间的最小距离最大(包括第一个点和1点,以及第N个点和L)。
二分加贪心,解题思路:二分最小距离,每次二分得出的最小距离mid都丢进贪心里面判断是否满足:贪心的时候保留开始的1点,然后判断下一个点和前一个保留下来的点的距离是否比mid小,小的话就丢掉这个点。最后看一共丢了多少个点。如果丢的点比M多,证明这个距离mid取大了,我可以取小一点使得丢掉的点要少点。反之亦然。
注意进行二分的判断时,因为是整数的判断,因此我设l<=h,上下限改变分别是mid+1和mid-1,最后输出的是l
/* * POJ3258RiverHopscotch.cpp * * Created on: 2014年7月24日 * Author: Prophet */#include<stdio.h>#include<algorithm>using namespace std;const int MAX_N = 50000+10;int L,N,M;int dist[MAX_N];bool comp(const int a,const int b);int binary_search(int l,int h,int k);int main(){scanf("%d%d%d",&L,&N,&M);dist[0] = 0;dist[N+1] = L;for(int i=1;i<=N;i++)scanf("%d",&dist[i]);sort(dist+1,dist+N+1,comp);printf("%d\n",binary_search(0,L,M));return 0;}int binary_search(int l,int h,int k){int mid,last,count;while(l<=h){mid = (l+h)/2;last = 0;count = 0;for(int i=1;i<=N+1;i++){if(dist[i]-dist[last] <= mid)//要把前一点(last)拿走,因此last还是保持原来的计数count++;elselast = i;}if(count > k)//比M大说明石头间范围太大了,应该缩小,所以上限收窄h = mid-1;elsel = mid+1;}return l;}bool comp(const int a,const int b){return a<b;}
0 0
- POJ3258River Hopscotch
- poj3258River Hopscotch
- poj3258River Hopscotch(二分)
- poj3258River Hopscotch【二分】
- poj3258River Hopscotch(二分)
- Hopscotch
- Hopscotch
- Hopscotch
- * Hopscotch
- Hopscotch
- Hopscotch
- Hopscotch
- POJ3050 Hopscotch
- POJ3050--Hopscotch
- River Hopscotch
- POJ3050-Hopscotch
- River Hopscotch
- Hopscotch POJ3050
- EditText的属性
- Makefile讲义(11)——后序
- hdu 2044 一只小蜜蜂
- rest风格webservice相关记录
- 程序员生涯之生活篇
- POJ3258River Hopscotch
- Jungle Roads - POJ 1251 最小生成树
- UVA 113Power of Cryptography
- windows与linux读取文件夹下的文件
- java.lang.OutOfMemoryError: PermGen space问题
- HDU 2063 二分匹配(匈牙利算法)
- Buy the souvenirs - HDU 2126 背包dp
- 简单的Java程序(章节摘要)
- 接口和抽象类的区别