3 条题解

  • 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;
    }

    信息

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