题目描述
Zexal想要发射火箭,但是由于能源供应不足了,所以一些火箭需要延迟发射。 每个火箭每延迟一小时发射都会相应的损失。Zexal了解到,一共有n个火箭,其中第i个火箭原计划在第i小时发射,即1~n时间段发射,现预计k小时后电力可以恢复正常,即所有火箭将在k+1~k+n时间段内发射,
新的火箭发射计划不要求按照最初的发射计划顺序,唯一的要求是每个火箭都不能早于原定时间发射。请你帮忙计算一下最小的损失吧。
注意:时间均以小时为最小单位。由于条件有限,一次只能发射一枚火箭。
输入
输入包含多组数据。
每组数据第一行为正整数n和k(1≤n≤500000,1≤k≤500000),为火箭总数和延迟时间。
接下来是n个正整数 pi,代表第i个火箭每延迟一小时的损失费(1≤pi≤104)。
输出
对于每组数据,输出一行,为最小的损失费用。
输入样例
1 2 10 2 1 10 100
输出样例
20 20
代码
#include <iostream> #include <algorithm> #include <queue> using namespace std; struct gun { int l,p; } s[500005]; bool operator<( gun x, gun y) { if(x.p==y.p) return x.l<y.l; return x.p < y.p; } priority_queue<gun> Q; int main() { int n,k; while(cin>>n>>k) { long long ans = 0; for(int i = 0; i < n; i++) { cin>>s[i].p; s[i].l = i; } for(int i = 0; i < k; i++) Q.push(s[i]); for(int i = k; i < k+n; i++) { if(i < n) Q.push(s[i]); gun t = Q.top(); ans += (long long )(i - t.l) * t.p; Q.pop(); } cout << ans <<endl; } return 0; }