2 条题解

  • 0
    @ 2026-7-20 1:42:39

    P1824 [USACO05FEB] 进击的奶牛 Aggressive Cows G——题解

    解题思路

    先排序牛舍位置。二分候选最小距离 dd,从最左牛舍开始贪心放牛,之后每次选择第一个与上一头牛距离至少为 dd 的牛舍。若能放够 mm 头,说明 dd 可行。

    复杂度分析

    排序 O(nlogn)O(n\log n),二分检查 O(nlog(xmaxxmin))O(n\log(x_{max}-x_{min})),空间 O(n)O(n)

    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
      @ 2026-7-20 1:42:39

      #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

      [USACO05FEB] 进击的奶牛 Aggressive Cows G

      信息

      ID
      4931
      时间
      2000ms
      内存
      256MiB
      难度
      10
      标签
      递交数
      1
      已通过
      1
      上传者