贪心问题(二分判定法)---牛棚距离问题

Description

Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are located along a straight line at positions x1,…,xN (0 <= xi <= 1,000,000,000).

His C (2 <= C <= N) cows don’t like this barn layout and become aggressive towards each other once put into a stall. To prevent the cows from hurting each other, FJ want to assign the cows to the stalls, such that the minimum distance between any two of them is as large as possible. What is the largest minimum distance?

Input

  • Line 1: Two space-separated integers: N and C

  • Lines 2…N+1: Line i+1 contains an integer stall location, xi

Output

  • Line 1: One integer: the largest minimum distance

Sample Input

5 3
1
2
8
4
9

Sample Output

3

Hint

OUTPUT DETAILS:

FJ can put his 3 cows in the stalls at positions 1, 4 and 8, resulting in a minimum distance of 3.

Huge input data,scanf is recommended.

大致意思为:
一共有n个牛棚,每个牛棚的的位置为arr[i],有m头牛,牛棚之间的位置是线性的,要想让这m头牛之间的最小的距离最大化,求这个最大的最小距离。第一行输入牛棚的个数和牛的数目,随后的几行每一行输入一个牛棚的位置。

代码:

/*
问题描述:一共有n个牛棚,每个牛棚的的位置为arr[i],有m头牛,牛棚之间的位置是线性的,
要想让这m头牛之间的最小的距离最大化,求这个最大的最小距离

算法思路:把这个问题转换成为二分问题,判断m个牛棚,n头牛,dis的距离是否可行,如果可行,
则将dis的位置再二分增加,如果不行,则将dis的位置再二分减少。



 */




#include <iostream>
#include<algorithm>

const int MAXN=100;//根据自己需求改
using namespace std;

int arr[MAXN];


bool  judge(int n,int m,int dis){//判断m个牛棚,n头牛,dis的距离是否可行
int current;
current=arr[0];
int sum=1;
for(int i=1;i<n;i++){
    if((arr[i]-current)>=dis){
        sum++;
        current=arr[i];
    }
    if(sum>=m){
    return true;
}
}

return false;
}


int main()
{int m,n;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){//输入每个牛棚的位置
    scanf("%d",&arr[i]);
}
sort(arr,arr+n);//先对牛棚的位置排序
 int left=1;
 int right=arr[n-1]-arr[0];

  while(left<=right){//二分查找位置
        int middle=left+(right-left)/2;
    if(judge(n,m,middle)){
        left=middle+1;
    }
    else{
        right=middle-1;
    }
  }
  printf("%d\n",right);
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 0-1背包问题是一个经典的组合优化问题,其目标是在限定的背包容量下,选择一组物品放入背包中,使得背包中物品的总价值最大化。 贪心是一种求解0-1背包问题的常用方。其基本思想是每次选择当前最有利的物品放入背包中,直至背包容量不足或所有物品都放入背包为止。 具体实现贪心0-1背包问题c的步骤如下: 1. 将所有物品按照单位重量的价值从大到小进行排序; 2. 初始化背包容量剩余空间为背包的总容量,初始化背包的总价值为0; 3. 依次遍历排序后的物品列表,对于每个物品: - 如果物品重量小于等于背包剩余空间,则将该物品放入背包中,背包剩余空间减少该物品重量,背包总价值增加该物品价值; - 如果物品重量大于背包剩余空间,则终止循环; 4. 返回背包中的物品总价值作为结果。 贪心0-1背包问题c的时间复杂度为O(nlogn),其中n为物品数量,主要消耗时间的操作是对物品列表的排序。 ### 回答2: 贪心是一种常用的求解最优问题的算,包括0-1背包问题。在0-1背包问题中,我们有一系列物品,每个物品有重量和价值两个属性。我们需要选择一些物品放入背包,使得背包的总重量不超过背包的容量,同时能够使得背包中物品的总价值最大化。 贪心的思想是每次选择当前最有利于解的选择,即每次选择重量最小但价值最高的物品放入背包。具体步骤如下: 1. 根据物品的重量和价值计算每个物品的价值密度(即单位重量下的价值)。 2. 将物品按照价值密度从高到低排序。 3. 依次选择物品放入背包,直到背包的重量达到限制或者所有物品都已经放入背包。 4. 计算放入背包的物品的总价值。 贪心的优点是简单高效,时间复杂度较低。然而,贪心并不保证能够得到最优解。在某些情况下,使用贪心得到的结果可能与动态规划等其他算得到的结果不一致。 对于0-1背包问题c,我们可以使用贪心求解。具体步骤如下: 1. 计算每个物品的价值密度,即价值除以重量。 2. 按照价值密度从高到低对物品进行排序。 3. 依次选择物品放入背包,直到背包的重量达到限制或者所有物品都已经放入背包。 4. 最后计算放入背包的物品的总价值。 需要注意的是,虽然贪心在某些情况下可能得到次优解,但在某些特殊的条件下,贪心却可以得到最优解。因此,在实际应用中,根据具体问题的特点选择合适的算是很重要的。 ### 回答3: 0-1背包问题是一个经典的动态规划问题,目标是在有限容量的背包中选择若干个物品放入背包,使得物品的总价值最大化。而贪心解决0-1背包问题的最优解。 贪心是一种贪婪的策略,每次选择当前看起来最好的解决方案。但在0-1背包问题中,贪心会导致错误的结果。例如,假设有三个物品A、B和C,分别占据1、4和3的容量,价值分别为2、5和4,而背包的容量为4。若采用贪心,首先选择B放入背包,然后剩余容量为0,无再放入其他物品,总价值为5。但实际上,最优解应该是选择A和C,总价值为6。 因此,为了解决0-1背包问题,需要采用动态规划的方。动态规划通过将问题划分为子问题,并保存子问题的解,最后通过组合子问题的解得到原问题的最优解。对于0-1背包问题,可以使用一个二维数组dp来保存子问题的解,其中dp[i][j]表示在前i个物品中,容量为j的背包可以获得的最大价值。通过迭代计算dp数组,最后得到dp[n][C]即为问题的最优解。 综上所述,贪心解决0-1背包问题的最优解,需要采用动态规划的方来求解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值