小biu放牛

解题思路
这道题呢,我们试着用二分来处理绳子的长度,然后用一个函数来处理这个长度的可行性。我们用贪心的方法,将每头牛尽量往前放,以保证后面牛的位置最大,当mid到的绳子的长度不能满足牛的排列时,我们就退出。当然,如果牛被挤出边界了,那么自然也不行。
code
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll n,x,m;
ll a[50010];
ll abs(ll t)
{
if(t<0)
return -t;
return t;
}
ll check(int mid)
{
ll hd,tl;
hd=tl=0;
for(int i=1;i<=n;i++)
{
hd=max(tl,a[i]-mid-x);
if(abs(hd-a[i]+x)>mid)
return 0;
tl=hd+2*x;
if(tl>m)
return 0;
}
return 1;
}
int main()
{
cin>>n>>x>>m;
if(n*x*2>m)
{
cout<<-1<<endl;
return 0;
}
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int l=0,r=m;
while(l<=r)
{
int mid=(r+l)/2;
if(check(mid))
r=mid-1;
else
l=mid+1;
}
cout<<l<<endl;
}
本文探讨了一种通过二分查找结合贪心策略解决牛群布局的问题。利用C++实现了一个检查函数,确保每头牛在给定长度的绳子限制下能够合理分布而不超出边界。
1679

被折叠的 条评论
为什么被折叠?



