UVA 1153 Keep the Customer Satisfied 顾客是上帝(贪心)

本文介绍了一种通过先按截止时间排序,再利用大根堆和交换策略来优化订单时间调度的方法,确保在不增加时间成本的情况下,合理安排订单处理顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为每增加一个订单,时间是会增加的,所以先按截止时间d排序,

这样的话无论是删除一个订单,或者增加订单,都不会影响已经选好的订单。

然后维护一个已经选好的订单的大根堆(优先队列),如果当前无法选择的话,

那么尝试和之前花费时间最长的交换。如果qi<qj的话,交换之后花费的时间更短且截止时间di更长,情况不会比没交换更糟·。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 8e5+5;
struct Cus
{
    int q,d;
    bool operator < (const Cus& x) const {
        return q < x.q;
    }
}P[maxn];

bool cmp(const Cus& x, const Cus& y) { return x.d < y.d; }
priority_queue<Cus> Q;


int main()
{
    //freopen("in.txt","r",stdin);
    int T; scanf("%d",&T);
    while(T--){
        int n; scanf("%d",&n);
        for(int i = 0; i < n; i++)
            scanf("%d%d",&P[i].q,&P[i].d);
        sort(P,P+n,cmp);
        int cur = 0;
        for(int i = 0; i < n; i++){
            if(P[i].q + cur <= P[i].d) Q.push(P[i]), cur += P[i].q;
            else {
                if(Q.size() && P[i].q < Q.top().q ) {
                      cur += P[i].q - Q.top().q;
                      Q.pop(); Q.push(P[i]);
                }
            }
        }
        printf("%d\n",Q.size());
        while(Q.size()) Q.pop();
        if(T) putchar('\n');
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/jerryRey/p/4706185.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值