Codeforces 853A Planning

来源:互联网 发布:mac删除桌面文件 编辑:程序博客网 时间:2024/06/18 17:57

日常一水。

题目来源: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;}

原创粉丝点击