3 条题解
-
3
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+1; int n,c; int a[maxn]; bool check(int d) { int cow=1; int now=a[1]+d; for(int i=2;i<=n;i++) { if(a[i]<now) continue; cow++; now=a[i]+d; } return cow>=c; } int main() { cin>>n>>c; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+n+1); int l=0,r=a[n]-a[1]; while(l<=r) { int mid=(l+r)>>1; if(check(mid)) l=mid+1; else r=mid-1; } cout<<r; return 0; }
-
1
一个妥妥的二分答案嗷
#include <bits/stdc++.h> using namespace std; /*校验距离为mid,能安放牛的数量 w w<c mid偏大 r=mid-1 w>c 偏小 l=mid+1 w=c 找右边界 l=mid+1 */ const int N=1e9; int n,c; int a[100010]; int check(int mid){ int w=1;//校验距离为mid,能安放牛的数量 w int start=1; for(int i=2;i<=n;i++){ if(a[i]-a[start]>=mid){ w++; start=i;//上一个放牛的牛棚坐标 } } return w; } int main() { scanf("%d%d",&n,&c); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } sort(a+1,a+n+1); int l=1,r=N,mid; while(l<=r){ mid=l+r>>1; if(check(mid)>=c){ l=mid+1; }else{ r=mid-1; } } printf("%d",r); return 0; }
-
1
#include <bits/stdc++.h> using namespace std; int a[1000010],n,c; bool check(int d){ int cnt=0,last=-1e9; for(int i=1;i<=n;i++) { if(a[i]-last>=d) { last=a[i]; cnt++; } } return cnt>=c; } int find(){ int l=0,r=1e9,ret=0; while(l<=r) { int mid=(l+r)/2; if(check(mid)) { ret=mid; l=mid+1; } else { r=mid-1; } } return ret; } int main() { cin>>n>>c; for(int i=1;i<=n;i++) { cin>>a[i]; } sort(a+1,a+n+1); cout<<find(); return 0; }
- 1
信息
- ID
- 906
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 73
- 已通过
- 40
- 上传者