进击的奶牛[普及-] 二分答案
作者:互联网
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