poj3258

2024-02-02 23:08
文章标签 poj3258

本文主要是介绍poj3258,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

链接:点击打开链接

题目:一条长L的河上,除了起点和终点还有N个石子,分别距离起点距离di,求去掉M个石子后相邻的最小距离的最大值

代码:

#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int D[50005];
int L,N,M;
bool judge(int d){
int i,st,en,sum;
st=sum=0;
for(i=1;i<=N;i++){
en=st+1;
while(en<=N+1&&D[en]-D[st]<d)
en++,sum++;
if(sum>M)               //判断删除的个数是否满足M个    
return 0;
st=en;
}
return 1;
}                   
int main(){                     //最大化最小值,用二分处理
int i,j,l,r,mid;
while(scanf("%d%d%d",&L,&N,&M)!=EOF){
for(i=1;i<=N;i++)
scanf("%d",&D[i]);
D[0]=0,D[N+1]=L;
sort(D,D+N+2);
l=r=L;
for(i=1;i<=N+1;i++)     //初始值不能设成0和INF会有10 0 0这类的数据
l=min(l,D[i]-D[i-1]);
while(r-l>1){
mid=(l+r)/2;
if(judge(mid))
l=mid;
else
r=mid;
}
printf("%d\n",l);
}
return 0;
}


 

这篇关于poj3258的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/672258

相关文章

POJ3258 二分初步/奶牛跳河 ZOJ4033 省赛-.-

/*   //poj3285  04.27 二分的是后面的答案 因为数据不是很大 二分就是后面逐步逼近数据范围 最后得到什么 再具体一点的话 这个题想求的是什么?是之间的最小距离 二分的恐怖之处就在于它  O(nlogn的复杂度).【adds】 【adds】 简化着  简化着  没了。。。 首先需要判断  那么就是实验一下去掉哪几个点 judege(n)就可以了 那么这个

POJ3258(二分)

题意: 有一群牛要过河,河长L,河中有N块石头,每块石头离河边Di远,现在要去掉M块石头,求剩下的石头之间以及石头与河岸的最小距离的最大值。 题解: 看代码。 #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int MAXN=50000+10;int L,n,m;in

【二分法】POJ3258-River Hopscotch

【抱大腿】啊啊啊又是一道恶心的题目!!!这道题是出在二分法里面的,因为这跟前面的一道青蛙过河的题特别像但是不一样,按照青蛙过河那个思路来走根本行不通,正好要按照跟那个思路相反的想法来想才行~ 【题目】 River Hopscotch Time Limit: 2000MS Memory Limit: 65536Kxxxxxxxxx马赛克xxxxxxxxx xxxxxxxx

POJ3258 二分与最小值最大化

题目的意思就是一排石子,拿走几个,使这些石子相邻间距中的最小值最大。不会做,只能看网上的代码,发现解释也很少,最后还是自己一点点搞懂的,但没完全搞懂,有的地方还是略不理解 这题看了网上的代码都是用二分法,那么思路是这样的,先排序,然后再从大到小假设要求的区间mid,这个区间就是一直二分得到,那么用这个区间和相邻石子的区间比较,如果小于这个区间,就把后一个石子拿走(因为前一个如果是第一个拿不走啊)