ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

进击的奶牛[普及-] 二分答案

2022-07-08 17:32:40  阅读:98  来源: 互联网

标签:二分 头牛 进击 sum ++ 距离 int 奶牛


https://www.luogu.com.cn/problem/P1824
涉及知识点:二分
橙色题
思路:

题目大体意思(更好理解):有n头牛,你需要在其中选c头,使得这c头牛最近的2头牛之间的的距离最远,输出最近的最远距离

我们可以从最大距离和最小距离之间选择一个最大的可实现距离,因为数据过大,无法顺序选择,只有通过二分可以实现:先二分找一个距离,若这个距离可以实现,则用变量替换此数(注意不用比较,因为二分得到的答案一定是更优更大的),就往更大的距离去寻找,若这个距离不可以实现,就往更小的距离去找,重复寻找,直到区域区间之内没数为止。


 

代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,a[100005],ans;
bool check(int x)
{
    int l=a[1],sum=1; //l记录上一只牛的位置,开始时第一只牛一定在第一个牛栏 ,所以一开始sum=1 
    for(int i=2; i<=n; i++) //依次枚举每个牛栏 
    {
        if(a[i]-l>=x){  //若距离大于等于mid 
         sum++; //放牛数++; 
         l=a[i]; //更新上一次的牛栏位置 ,即上一头牛放的位置 
       } 
    } 
    return sum>=m; //直到放牛数大于或等于这C头牛 
}
int main()
{
    cin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        cin>>a[i];
    }
    sort(a+1,a+n+1);  //二分必须的排序 
    int l=1,r=a[n]-a[1]; //l表示可能情况距离最小值
                         //r表示可能情况距离最大值 
    while(l<=r) //模板 
    {
        int mid=(l+r)/2; //先二分找一个距离(也就是中间的),如果符合向右找更大的,不符合向左找。 
        if(check(mid))   //check看距离是否可行 
        {
        l=mid+1;
        ans=max(ans,mid);  //取距离最大的最近距离 当然这行代码也可以改成 ans=mid; 因为二分得到的答案一定是更优更大的 ,一直往更优更大的距离去找 
    }
        else r=mid-1;
    }
    cout<<ans; //输出距离 
  return 0;
 } 

 

 

标签:二分,头牛,进击,sum,++,距离,int,奶牛
来源: https://www.cnblogs.com/2elaina/p/16459091.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有