2 条题解

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

    P3853 [TJOI2007] 路标设置——题解

    解题思路

    二分空旷指数 dd。对于长度为 gap 的原有间隔,要让所有小间隔不超过 dd,最少新增路标数为 (gap1)/dfloor\lfloor(gap-1)/d floor。把所有间隔需求相加,不超过 KK 时说明 dd 可行,并尝试更小。

    复杂度分析

    检查 O(N)O(N),总时间 O(NlogL)O(N\log L),空间 O(N)O(N)

    C++17 参考代码

    #include <bits/stdc++.h>
    using namespace std;
    int main(){
        ios::sync_with_stdio(false);cin.tie(nullptr);
        int L,N,K;cin>>L>>N>>K;vector<int>a(N);for(int&i:a)cin>>i;
        auto ok=[&](int d){long long need=0;for(int i=1;i<N;i++)need+=(a[i]-a[i-1]-1)/d;return need<=K;};
        int lo=1,hi=L,ans=L;while(lo<=hi){int mid=(lo+hi)/2;if(ok(mid))ans=mid,hi=mid-1;else lo=mid+1;}
        cout<<ans<<'\n';return 0;
    }
    
    • 0
      @ 2026-7-20 1:42:41

      #include <bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(false);cin.tie(nullptr); int L,N,K;cin>>L>>N>>K;vectora(N);for(int&i:a)cin>>i; auto ok=[&](int d){long long need=0;for(int i=1;i<N;i++)need+=(a[i]-a[i-1]-1)/d;return need<=K;}; int lo=1,hi=L,ans=L;while(lo<=hi){int mid=(lo+hi)/2;if(ok(mid))ans=mid,hi=mid-1;else lo=mid+1;} cout<<ans<<'\n';return 0; }

      • 1

      信息

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