Codeforces Round#433 C Planning

本文介绍了一种使用优先队列和贪心算法解决航班延误最小费用问题的方法。具体地,针对给定数量的飞机和特定的限制条件,通过最优顺序安排起飞时间来最小化总的延误成本。

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

C.Planning
题目传送门

题意&分析:
机场有n架飞机,第 i 架起飞时间是 i ,现在机场前 k 单位时间不可以有飞机起飞,所以得推迟航班。第 i 架航班每延误 1 单位时间就要花费机场 ci 的费用,现在求最小的赔偿费用。

这是一个优先队列+贪心的题目,对于前 k 架次的航班全部入队,因为他们肯定延误了,然后将剩下的航班依次加入队列(前面放走一架,后面就有一架飞机要延误,所以要加入队列中),然后取队首元素(按照花费较大的原则)。。。

代码如下:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define TEST cout<<"stop here"<<endl
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;

struct node {
    ll id,cost;
    bool operator <(const node a)const{
        return cost < a.cost;//最大值优先
    }
}a[300005];

ll odr[300005]; 
ll n,k;
priority_queue<node> que;

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);

    while(cin>>n>>k){
        memset(odr,0,sizeof(odr));
        for(ll i=1;i<=n;i++){
            cin>>a[i].cost;
            a[i].id  = i;
        }

        ll d = min(n,k);
        for(ll i=1;i<=d;i++){
            que.push(a[i]);
        }
        ll ans = 0;
        for(ll i=k+1;i<=n+k;i++){
           if(i<=n){
                que.push(a[i]);
           }
            node tmp = que.top();
            que.pop();
            ans += (i - tmp.id) * tmp.cost;
            odr[tmp.id] = i;
        }

        cout<< ans <<endl;
        for(int i=1;i<=n;i++){
            cout<< odr[i] << ((i!=n) ? " ":"\n");
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值