2 条题解

  • 0
    @ 2025-10-27 0:53:52

    可以直接求平均值

    #include<iostream>
    using namespace std;
    int main(){
        int t;
        cin>>t;
        while(t--){
            int n,m,k;
            cin>>n>>m>>k;
            if(k<=n*((m+1)/2)){
                cout<<"1"<<'\n'; 
            }else{
                int a;      //求可以坐几列,未满一列算一列
            if(k%n==0){
                a=k/n;
            }else{
                a=k/n+1;   
            }
            int b=a/((m-a)+1);          //(m-a)是剩的列
            if(a%((m-a)+1)==0){         //求平均
                cout<<b<<'\n';
            }
            else{
                cout<<b+1<<'\n';
            }
            }
            
        }
        return 0;
        
    }
    
    • 0
      @ 2025-10-26 16:06:59

      考虑贪心选择。不浪费长凳长度。

      此时长凳的摆放方式如下:

      也就是说若选择长凳长度为 q,则每行必须空出 m/q 个位置。也就是说,每行最多选择 m​m/q 个位置,总共最多选 n∗(m​m/q) 个位置。

      二分 q 即可。若 qk,则代表能够坐下所有人;若 q<k 则代表不能。

      时间复杂度:O(lognlogm)。

      • @ 2025-10-26 16:07:05
        #include<bits/stdc++.h>
        using namespace std;
        #define int long long
        int n,m,k;
        bool check(int x){
            int sum = n * (m - (m/x));
            return sum >= k;
        }
        void solve() {
            cin >> n >> m >> k;
            int l = 1,r = m + 1;
            int ans = m;
            while(l <= r){
                int mid = (l + r) >> 1;
                if(check(mid)){
                    ans = mid;
                    r = mid - 1;
                }
                else l = mid + 1;
            }
            cout << ans - 1 << endl;
        }
        signed main() {
            ios::sync_with_stdio(0);
            cin.tie(0), cout.tie(0);
            int T = 1;
            cin >> T;
            while (T--) solve();
            return 0;
        }
        
    • 1

    纵横千里独行客 何惧前路雨潇潇

    信息

    ID
    1162
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    9
    已通过
    3
    上传者