1 条题解

  • 0
    @ 2023-7-1 8:59:39

    暴力会超时,考虑二分。

    二分的 l=1,r=l1l=1,r=l_1lnl_n 的最大值。

    check 函数中,如果 li<xl_i<x,退出循环。否则计数器 cnt 增加 li÷x×sil_i \div x \times s_i

    最后,别忘了将结构体数组排序。

    #include <bits/stdc++.h>
    using namespace std;
    struct Tree{
        int l,s;
    }a[10001];
    int n,m;
    int l=1,r;
    bool check(int x){
        int cnt=0;
        for (int i=1;i<=n;i++){
            if (a[i].l<x){
                break;
            }
            cnt+=a[i].l/x*a[i].s;//求出当前木材商能供应多少根长x的木头。
        }
        return cnt>=m;
    }
    bool cmp(Tree x,Tree y){
        return x.l>y.l;
    }
    int main(){
        cin>>n>>m>>a[1].l>>a[1].s;
        r=a[1].l;
        for (int i=2;i<=n;i++){
            a[i].l=((a[i-1].l*37011+10193)%10000)+1;
            a[i].s=((a[i-1].s*73011+24793)%100)+1;
            r=max(r,a[i].l);
        }
        sort(a+1,a+n+1,cmp);//别忘了排序!!!
        while (l<=r){
            int mid=(l+r)>>1;
            if (check(mid)){
                l=mid+1;
            }else{
                r=mid-1;
            }
        }
        cout<<r;
        return 0;
    }
    
    • 1

    信息

    ID
    558
    时间
    1000ms
    内存
    128MiB
    难度
    4
    标签
    递交数
    96
    已通过
    48
    上传者