poj 2970 优先队列

本文介绍了一种通过优先级排序和资源优化分配解决合同任务管理问题的算法。该算法首先按合同截止日期排序,然后通过优先级队列动态调整任务执行顺序,以确保所有合同都能在截止日期前完成。特别地,当当前任务无法按时完成时,算法会从已完成的任务中选择成本效益最高的任务进行加速处理,从而提高整体效率。

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

先按di排序,(从小到大)。然后依次完成合同,若发现第i个合同无法在截止日期前完成,便从之前已经完成的任务中选一个aj最大的合同,付钱来使得这个合同尽快完成。

#include<cstring>
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
struct node
{
    int q;
    int w;
    bool operator < (const node& t) const {
        return q<t.q;
    }
};
struct shsh
{
    int q,w,e;
    bool operator<(const shsh&kk) const{
    return e<kk.e;
    }
}yy[101005];
node k;
priority_queue<node> q;
int main()
{
    int a;
    //priority_queue<node> q;
    while(~scanf("%d",&a))
    {
        while(!q.empty())
            q.pop();
    for(int i=0;i<a;i++)
    {
        scanf("%d%d%d",&yy[i].q,&yy[i].w,&yy[i].e);
    }
    long long ans=0;
    double sum=0;
    sort(yy,yy+a);
    //for(int i=0;i<a;i++)
    //{
        //printf("%d %d %d\n",yy[i].q,yy[i].w,yy[i].e);
    //}
    for(int i=0;i<a;i++)
    {
        ans+=yy[i].w;
        k.q=yy[i].q;
        k.w=yy[i].w;
        q.push(k);
        while(ans>yy[i].e&&!q.empty())
        {
            node ee=q.top();
            q.pop();
            if(ee.w<ans-yy[i].e)
            {
                sum+=ee.w*1.0/ee.q;
                ans-=ee.w;
            }
            else
            {
                ee.w-=ans-yy[i].e;
                sum+=(ans-yy[i].e)*1.0/ee.q;
                ans=yy[i].e;
                q.push(ee);
            }
        }
    }
    printf("%.2f\n",sum);
    }
    return 0;
}//用G++提交,用%.2lf输出会错。。。大哭大哭

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值