POJ3258跳房子

简介: POJ3258跳房子

9bd77fe7bb6b4095b053339a77cf13d9.png

43f7b1d336d14a98b3d07050e7f6c14d.png

思路分析:要求母牛跳跃最短距离的最大值.暴力的判断肯定不行,复杂度太高.因为每个石头间的距离已知,我们可以通过距离来判断石头是否可以放的下.所以二分法寻找最小距离,然后判断即可.

#include<iostream>
#include<algorithm>
using namespace std;
const int maxsize = 50000 +10;
int dis[maxsize],l,n,m,ans,mid;
int judge(int x) { // 最小距离为x
  int last = 0;
  int num = n - m;//减掉m个石头 
  int cur;//放置num个石头,循环num次
  for(int i = 0; i < num; i++) { //对于这些石头,要使任意间距不小于x
    cur = last + 1;//当前石头的编号 
    while(cur<=n&&(dis[cur]-dis[last]<x)) {//>=x才能放石头 
      cur++;//不满足,则继续判断下一个. 
    }
    if(cur>n) {//如果石头总数大于n了,则说明距离过大了,能放置的石头太少. 
      return 0;
    }
    last = cur;//更新上一块石头的编号.继续判断下一个石头是否可以放置.. 
  }
  return 1;
}
int main() {
  cin>>l>>n>>m;
  for(int i = 1; i <= n; i++) {
    cin>>dis[i];
  }
  if(n==m) {
    cout<<l<<endl;//如果移除的石头数和拥有的石头数相同,则最小距离就是l
    return 0;
  }
  dis[0] = 0;
  dis[n+1] = l;
  sort(dis,dis+n+2);
  int right = l,left = 0;
  while(left<=right){//二分的模板.. 
    mid = (left+right) / 2;
    if(judge(mid)){
      left = mid+1;
      ans = mid;
    }else{
      right =mid-1;
    }
  }
  cout<<ans<<endl;
  return 0;
}
相关文章
|
6月前
|
算法 数据建模
Poj 3169(差分约束系统)
Poj 3169(差分约束系统)
34 0
poj 3620
题意:给出一个矩阵,其中有些格子干燥、有些潮湿。       如果一个潮湿的格子的相邻的四个方向有格子也是潮湿的,那么它们就可以构成更大       的湖泊,求最大的湖泊。       也就是求出最大的连在一块儿的潮湿的格子的数目。
573 0
poj 2299 求逆序数
http://poj.org/problem?id=2299 #include using namespace std; int aa[500010],bb[500010]; long long s=0; void merge(int l,int m,int r) { ...
796 0
poj-1008-玛雅历
Description 上周末,M.A. Ya教授对古老的玛雅有了一个重大发现。从一个古老的节绳(玛雅人用于记事的工具)中,教授发现玛雅人使用了一个一年有365天的叫做Haab的历法。这个Haab历法拥有19个月,在开始的18个月,一个月有20天,月份的名字分别是pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax, koyab, cumhu。
883 0
|
机器学习/深度学习
|
人工智能 机器学习/深度学习