日常一水。
题目来源:CF-853A
题意及简单分析:有n架飞机,原本打算从第1分钟到第n分钟陆续起飞,但是由于某种原因,前K分钟不允许起飞,每架飞机每延迟一分钟(和原起飞时间相比)花费一个cost_i值,而且每架飞机的起飞时间不能比原起飞时间提前,请调整各架飞机起飞的时间,使总cost最小。
简单贪心。所有飞机延迟一分钟的总共的花费是一定的,所以你只需要选择当前能起飞的飞机中cost最大的起飞就可以,为了维护这样一个性质可以采用优先队列。
本题的一个坑点就是答案范围超过int。
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <cstring>
#include <queue>
using namespace std;
struct node
{
long long day;
long long cost;
};
const int MAXN = 3e5 + 5;
bool operator <(const node&a, const node& b)
{
return a.cost < b.cost;
}
int pri[MAXN];
node p[MAXN];
int main()
{
int n, k;
long long ans = 0;
scanf("%d%d", &n, &k);
for (int i = 1;i <= n;++i)
{
int val;
scanf("%d", &val);
p[i].day = i;
p[i].cost = val;
}
priority_queue <node> q;
node cur;
for (long long i = 1;i <= n;++i)
{
q.push(p[i]);
if (i >= k + 1)
{
cur = q.top();
ans += (cur.cost*(i - cur.day));
pri[cur.day] = i;
q.pop();
}
}
long long s = n+1;
while (q.empty() == false)
{
cur = q.top();
ans += (cur.cost*(s - cur.day));
pri[cur.day] = s;
s++;
q.pop();
}
printf("%I64d\n", ans);
for (int i = 1;i <= n;++i)
{
printf("%d%c", pri[i], i == n ? '\n' : ' ');
}
return 0;
}