贪心算法--牛牛的朋友

标题:贪心算法–区间问题

链接:https://ac.nowcoder.com/acm/problem/21545
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 32768K,其他语言65536K

64bit IO Format: %lld

题目描述

牛牛有一群牛友,每只小牛都站在坐标轴上的某个位置,这群牛友很听牛牛的话,每当牛牛做个手势,每只小牛都会移动恰好X个单位的距离,要么向左,要么向右

现在告诉你每只小牛在移动前的位置,求移动之后最左边的牛与最右边的牛的最小距离

输入描述:
第一行输入一个整数n (1 ≤ n ≤ 50),表示牛的数量
第二行输入n个数pi (-1e8 ≤ pi ≤ 1e8),表示每只牛的位置
第三行输入一个整数X (0 ≤ X ≤ 1e8)
输出描述:
输出一个整数
示例1

输入

3
-3 0 1
3

输出:

3

题目链接:牛牛的朋友
题目思路:
先排序,sort函数
找左右边界,两者之差就是距离
有四种情况:
1.都往右移动之间距离不变,不可行
2.都往左移动之间距离不变,不可行
3.i往右移动,i+1往左移动,可行
4.i往左移动,i+1往右移动,不可行
求最短距离,然后更新ans
贪心算法--牛牛的朋友_第1张图片
对红色的点枚举,左边界的更新是a[i+1]-x和第一个数往右a[1]+x的最小值因为左边所有的值往右,右边所有的值往左,因此左边往右后的值都比第一个往右大,右边所有的值往左都比a[i+1]-x大,因此a[i+1]-x和第一个数往右a[1]+x的最小值就是新的左边界,同理右边界也可推出,不断枚举所有的红点找出最小的N那个。
初始化ans=a[n]-a[1]的原因:
下面图片的第三种情况
贪心算法--牛牛的朋友_第2张图片
代码:

#include
using namespace std; 
typedef long long int ll;
ll  n,a[50],x,lf,ri,ans=0;  
int main()
{
     
 cin>>n;
 for(int i=1;i<=n;i++)
 {
     
  cin>>a[i];
 }
 cin>>x;
 sort(a+1,a+n+1);
 ans=a[n]-a[1];//初始化为 a[n]-a[1],原因是有一种情况可能为原边界差值就是最小值 
 for(int i=1;i<n;i++)
 {
     
  lf=min(a[1]+x,a[i+1]-x);//l初始化为a[1]+x,求最大的左边界,a[i+1]-x是从2到n的所有可能是左边界的值 
  ri=max(a[n]-x,a[i]+x);//r初始化为a[n]-x,求最小的右边界值,a[i]+x是从1到n-1中可能是右边界的值 
  ans=min(ans,ri-lf);//更新结果 
 }
 cout<<ans;
 return 0; 
}

贪心训练题库:
贪心专题

你可能感兴趣的:(贪心,算法,贪心算法)