1 条题解

  • 0
    @ 2025-7-2 14:58:22

    底下的牛的强壮程度SS越大越好
    上面牛的重量和WW越小越好(越重的放越下面)
    =>
    直觉是S[i]+W[i]越大的放越下面

    证:

    贪心得到的答案≥最优解(根据最优解定义:所有排序方案的最小值)

    贪心得到的答案≤最优解

    如果不是按S[i]+W[i]从小到大排序一定存在相邻ii+1wi+si>wi+1+si+1w_{i}+s_{i}>w_{i+1}+s_{i+1}

    • 可以发现此时交换第ii头牛和第i+1i+1头牛不影响[0,i1][0,i-1][i+2,n][i+2,n]的风险

    变化

    ii个位置上的牛

    i+1i+1个位置上的牛

    交换前

    w1++w(i1)siw_1+…+w_(i-1)-s_i w1++w(i)s(i+1)w_1+…+w_(i)-s_(i+1)

    交换后

    w1++w(i1)s(i+1)w_1+…+w_(i-1)-s_(i+1) w1++w(i1)+w(i+1)s(i)w_1+…+w_(i-1)+w_(i+1)-s_(i)
    • i1i-1项减去

    变化

    ii个位置上的牛

    i+1i+1个位置上的牛

    交换前

    si-s_i w(i)s(i+1)w_(i)-s_(i+1)

    交换后

    s(i+1)-s_(i+1) w(i+1)s(i)w_(i+1)-s_(i)
    • 加上si+si+1s_{i}+s_{i+1}

    变化

    ii个位置上的牛

    i+1i+1个位置上的牛

    交换前

    s(i+1)s_(i+1) wi+siw_i+s_i

    交换后

    sis_i w(i+1)+s(i+1)w_(i+1)+s_(i+1) $$w_i+s_i>s_i\\\\ w_i+s_i \geq w_(i+1)+s_(i+1)\\\\ w_i+s_i \geq max(s_i,w_(i+1)+s_(i+1))\\\\ 由w_{i}+s_{i}>w_{i+1}+s_{i+1} -> w_{i}+s_{i}>s_{i+1}-> w_{i}+s_{i}=max(s_(i+1),w_i+s_i)\\\\ max(s_(i+1),w_i+s_i) \geq max(s_i,w_(i+1)+s_(i+1))\\\\ max(交换前) \geq max(交换后)\\\\ 所有风险的最大值起码不会变大\\\\ 即只要w_{i}+s_{i}不是严格递增,则我们可以把他们变成递增的\\\\ 并且所有风险的最大值不会变大$$
    #include<bits/stdc++.h>
    using namespace std;
    
    typedef pair<int,int> PII;
    const int N=50010;
    #define x first
    #define y second
    
    int n;
    PII cow[N];
    
    int main()
    {
        cin >> n;
        for(int i=0;i<n;i++)
        {
            int w,s;
            cin >> w >> s;
            cow[i] = {w+s,w};
        }
        sort(cow,cow+n);
        int res = -1e9,sum=0;
        for(int i=0;i<n;i++)
        {
            int s;
            s = cow[i].x-cow[i].y;
            res = max(res,sum-s);//风险 = 上面的重量-当前的承受
            sum+=cow[i].y;
        }
        cout << res;
        return 0;
    }
    
    • 1

    信息

    ID
    60
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    17
    已通过
    8
    上传者