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;
}