SPOJ - AGGRCOW Aggressive cows(二分枚举最优解)
题意:给出n个位置,需要将m头牛放在这些位置中,使得所有相邻两头牛间的最小距离最大,求最大的最小距离;
思路:二分枚举最优解。先将所有位置排序,从最大总距离枚举到0,若满足差值大于等于枚举值的位置个数大于等于m,则当前枚举值为最优解。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int t,n,m; int num[500100]; int a[500100]; int judge(int x) { int cnt=1,temp=num[0]; for(int i=1;i<n;i++) { if(num[i]-temp>=x) { cnt++; if(cnt>=m) return 1; temp=num[i]; } } return 0; } int binary() { int l=0,r=num[n-1]-num[0]; while(l<=r) { int mid=(l+r)/2; if(judge(mid)) l=mid+1; else r=mid-1; } return l-1; } int main() { int i,j,k; while(scanf("%d",&t)!=EOF) { while(t--) { memset(num,0,sizeof(num)); scanf("%d%d",&n,&m); for(i=0;i<n;i++) { scanf("%d",&num[i]); } sort(num,num+n); printf("%d\n",binary()); } } }
有些梦想现在不去实现,以后就再也没机会了!!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步