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

来源:互联网 发布:足彩数据 编辑:程序博客网 时间:2024/06/06 20:34

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;}
阅读全文
0 0