3 条题解

  • 1
    @ 2025-2-8 22:09:53
    #include <bits/stdc++.h>
    using namespace std;
    struct node {
        int t;//截止时间
        int w;//罚款
    };
    node a[1005];
    int m,n;
    bool cmp(node x,node y){//按截止时间排序,截止时间大的排前面
        return x.t>y.t;
    }
    priority_queue<int> q;//优先队列,罚款最大的排前面
    int main() {
        cin>>m>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i].t;
        }
        for(int i=1;i<=n;i++){
            cin>>a[i].w;
        }
        sort(a+1,a+n+1,cmp);//按截止时间排序
        int p=1;
        for(int i=n;i>=1;i--){//枚举从后到前的时间
            while(a[p].t>=i&&p<=n){//可以在截止时间内做的都放入优先队列
                q.push(a[p].w);
                p++;
            }
            if (!q.empty()){//如果有可以做的,做罚款最大的
                q.pop();
            }
        }
        while (!q.empty()){//所有没做的任务
            m-=q.top();//计算罚款
            q.pop();
        }
        cout<<m;
        return 0;
    }
    • 1
      @ 2024-12-29 16:25:33

      #include <bits/stdc++.h> using namespace std; struct node { int t;//截止时间 int w;//罚款 }; node a[1005]; int m,n; bool cmp(node x,node y){//按截止时间排序,截止时间大的排前面 return x.t>y.t; } priority_queue q;//优先队列,罚款最大的排前面 int main() { cin>>m>>n; for(int i=1;i<=n;i++){ cin>>a[i].t; } for(int i=1;i<=n;i++){ cin>>a[i].w; } sort(a+1,a+n+1,cmp);//按截止时间排序 int p=1; for(int i=n;i>=1;i--){//枚举从后到前的时间 while(a[p].t>=i&&p<=n){//可以在截止时间内做的都放入优先队列 q.push(a[p].w); p++; } if (!q.empty()){//如果有可以做的,做罚款最大的 q.pop(); } } while (!q.empty()){//所有没做的任务 m-=q.top();//计算罚款 q.pop(); } cout<<m; return 0; }

      • 0
        @ 2024-10-29 10:13:08

        将任务按截止时间排序; 枚举从后到前的时间,当前时间内做罚款最大的任务;

        #include <bits/stdc++.h>
        using namespace std;
        struct node {
            int t;//截止时间
            int w;//罚款
        };
        node a[1005];
        int m,n;
        bool cmp(node x,node y){//按截止时间排序,截止时间大的排前面
            return x.t>y.t;
        }
        priority_queue<int> q;//优先队列,罚款最大的排前面
        int main() {
            cin>>m>>n;
            for(int i=1;i<=n;i++){
                cin>>a[i].t;
            }
            for(int i=1;i<=n;i++){
                cin>>a[i].w;
            }
            sort(a+1,a+n+1,cmp);//按截止时间排序
            int p=1;
            for(int i=n;i>=1;i--){//枚举从后到前的时间
                while(a[p].t>=i&&p<=n){//可以在截止时间内做的都放入优先队列
                    q.push(a[p].w);
                    p++;
                }
                if (!q.empty()){//如果有可以做的,做罚款最大的
                    q.pop();
                }
            }
            while (!q.empty()){//所有没做的任务
                m-=q.top();//计算罚款
                q.pop();
            }
            cout<<m;
            return 0;
        }
        • 1

        信息

        ID
        610
        时间
        1000ms
        内存
        512MiB
        难度
        10
        标签
        递交数
        1
        已通过
        1
        上传者