2 条题解
-
0
P1824 [USACO05FEB] 进击的奶牛 Aggressive Cows G——题解
解题思路
先排序牛舍位置。二分候选最小距离 ,从最左牛舍开始贪心放牛,之后每次选择第一个与上一头牛距离至少为 的牛舍。若能放够 头,说明 可行。
复杂度分析
排序 ,二分检查 ,空间 。
C++17 参考代码
#include <bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(false);cin.tie(nullptr); int n,m;cin>>n>>m;vector<long long>x(n);for(auto &v:x)cin>>v;sort(x.begin(),x.end()); auto ok=[&](long long d){int cnt=1;long long last=x[0];for(int i=1;i<n;i++)if(x[i]-last>=d){cnt++;last=x[i];}return cnt>=m;}; long long lo=0,hi=x.back()-x.front(),ans=0; while(lo<=hi){long long mid=(lo+hi)/2;if(ok(mid))ans=mid,lo=mid+1;else hi=mid-1;} cout<<ans<<'\n';return 0; } -
0
#include <bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(false);cin.tie(nullptr); int n,m;cin>>n>>m;vectorx(n);for(auto &v:x)cin>>v;sort(x.begin(),x.end()); auto ok=[&](long long d){int cnt=1;long long last=x[0];for(int i=1;i<n;i++)if(x[i]-last>=d){cnt++;last=x[i];}return cnt>=m;}; long long lo=0,hi=x.back()-x.front(),ans=0; while(lo<=hi){long long mid=(lo+hi)/2;if(ok(mid))ans=mid,lo=mid+1;else hi=mid-1;} cout<<ans<<'\n';return 0; }
- 1
信息
- ID
- 4931
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者
粤公网安备44195502000195号