Codeforces Round #433 (Div. 2)-贪心-C. Planning

http://codeforces.com/contest/854/problem/C
一些飞机本来是有顺序的,顺序为i,后来他们都要延时k分钟,
问你怎样安排才能让他们 损失的钱最少
(给你一个数组,说明他们每比开始预计的时间少,就要损失多少钱。)
又复习了一遍 优先队列。。。
这题有点赤裸裸。。
因为题中有一个限制条件,飞机不能比他们预定的时间还早。。
所以 我们维护一个 优先队列,开始放入 1-k的。然后找到一个最大的。
pop掉,然后再一个一个加。到了边界就不加 只pop。
用一个数组记录一下时间,完事。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=3e5+300;
struct node{
   int v,id;
   node(int _a,int _b){v=_a,id=_b;};
   friend bool operator<(node a,node b){
       return a.v<b.v;
   };
};
vector<pair<int,int> >v;
priority_queue<node>q;
int num[maxn];
int main()
{   int m,n,aa;
    while(~scanf("%d%d",&m,&n)){
           v.clear();
           v.push_back(make_pair(0,0));
           for(int i=1;i<=m;i++){
               scanf("%d",&aa);
               v.push_back(make_pair(aa,i));
           }
           int t=n+1;
           for(int i=1;i<=n+1;i++){
              q.push(node(v[i].first,v[i].second));
           }
           int tim=n+1;
           for(int i=1;i<=m;i++){
               node u=q.top();
               q.pop();
               num[u.id]=t;
               t++;
               tim++;
               if(tim<=m)
               q.push(node(v[tim].first,tim));
              // cout<<v[tim].first<<" "<<tim<<endl;
           }
           ll ans=0;
           for(int i=1;i<=m;i++){
             ans+=1ll*(num[i]-i)*v[i].first;
           }
           printf("%lld\n",ans);
           for(int i=1;i<=m;i++){
             if(i==1)
             printf("%d",num[i]);
             else
                printf(" %d",num[i]);
           }
           printf("\n");
     }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值