5 条题解

  • 5
    @ 2021-8-13 10:37:42

    60分,dfs枚举所有可能性

    每件物品要么网购,要么商店购买,可以用 dfs 枚举出所有方案,时间复杂度 O(2n)O(2^n)n20n\le 20 时都是可以的。

    #include <bits/stdc++.h>
    using namespace std;
    int n;
    struct Sth
    {
        long long a, b;
    };
    Sth a[100005];
    long long ans = 0;
    void dfs(int now, long long suma, long long maxb)
    {
        if (now > n)
        {
            ans = min(ans, max(suma, maxb));
            return;
        }
        dfs(now + 1, suma + a[now].a, maxb);
        dfs(now + 1, suma, max(maxb, a[now].b));
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> a[i].a;
        for (int i = 1; i <= n; i++)
        {
            cin >> a[i].b;
            ans = max(ans, a[i].b);
        }
        dfs(1, 0, 0);
        cout << ans << endl;
        return 0;
    }
    

    100分:贪心

    选择一个最大网购时间后,相当于所有大于这个网购时间的物品都是去商店购买,因此只需要按照网购时间排序,然后枚举每个物品作为最大网购时间的情况即可。时间复杂度 O(nlogn)O(nlog n)

       cin >> n;
    
        for (int i = 1; i <= n; i++)
            cin >> a[i].a;
    
        for (int i = 1; i <= n; i++)
            cin >> a[i].b;
    
        sort(a + 1, a + n + 1, cmp);
        long long ans = a[1].b;
        long long sum = 0;
        a[n + 1].b = 0;
    
        for (int i = 1; i <= n; i++) {
            sum = sum + a[i].a;
            ans = min(ans, max(sum, a[i + 1].b));
        }
    
        cout << ans << "\n";
    

    100分:二分答案

    对于每一个时间 midmid 判断是否可以 midmid 的时间内送达,即判断所有网购时间小于 midmid 的物品的到店购买时间之和是否小于等于 midmid

    这题出题时希望大家写的就是这个做法,但大家似乎都是贪心写的 hhhhh

    代码:略

  • 1
    @ 2022-8-6 23:17:01

    贪心
    嘤嘤嘤不知道为什么我的ans和sum一定义成long long类型程序就报错
    到最后我也不知道咋搞的就过样例了

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e9+5;
    int n;
    long long ans,sum=0;
    struct Buy{
        long long a,b;
    }buy[100005];
    bool cmp(Buy x,Buy y){
        return x.b>y.b;
    }
    int main(){
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>buy[i].a;
        }
        for(int i=1;i<=n;i++){
            cin>>buy[i].b;
        }
        sort(buy+1,buy+n+1,cmp);
        ans=buy[1].b;
        buy[n+1].b=0;
        for(int i=1;i<=n;i++){
            sum+=buy[i].a;
            ans=min(ans,max(sum,buy[i+1].b));
        }
        cout<<ans;
        return 0;
    }
    
    • -1
      @ 2023-10-5 22:54:42

      image

      • -3
        @ 2022-4-24 16:55:11

        写题解请注意

        鼓励大家写题解,但注意题解格式。

        题解一定要有思路解析或代码注释,能否让别人理解你的思路

        也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

        给代码两端加上这个会舒服一些

        ```cpp

        你的代码

        ```

        </span>

        这个点在键盘的左上角tab上面那个键,注意切换输入法

        #include<iostream>
        using namespace std;
        int main()
        {
            int n;
            cin>>n;//这是一个注释
            return 0;
        } 
        

        请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

        抄袭题解一经发现直接取消成绩。

        题解被删除的可能

        1. 代码不符合格式规范
        2. 没有思路讲解或者没有注释,
        3. 无意义的题解

        大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

        • -3
          @ 2021-8-12 10:27:28

          请注意:不要在 8 月 13 日 10:30 之前发布本题任何形式的题解,否则你的题解可能会被删除!

          • 1

          信息

          ID
          1208
          时间
          1000ms
          内存
          256MiB
          难度
          6
          标签
          递交数
          488
          已通过
          163
          上传者