【题目来源】
https://www.lanqiao.cn/problems/3150/learning/
【题目描述】
蓝桥 A 梦种植了 n 棵铜锣烧,第 i(1≤i≤n)棵铜锣烧在最初的美味度是 ai,每分钟所有铜锣烧的美味度都会增加 1。蓝桥 A 梦每个时刻可以收获一棵铜锣烧。当铜锣烧的美味度达到 k 时,如果没有立刻被收获,下一时刻就会消失。请你帮蓝桥 A 梦设计一个收获方案,最大化他收获的铜锣烧的美味度之和。
【输入格式】
第一行两个正整数 n,k。
第二行 n 个正整数,a1,a2,…… ,An。
含义如问题描述所示。
【输出格式】
共一行,一个正整数 ans,表示蓝桥 A 梦收获铜锣烧的美味度之和的最大值。
【输入样例】
6 7
7 4 6 2 1 6
【输出样例】
35
【说明】
所有输入数据不超过 2×10^5,1≤ai≤k。
下面给出样例解释:
时刻 | 铜锣烧的美味度 | 操作 | 收获铜锣烧的美味度之和 |
0 | 7,4,6,2,1,6 | 收获第1棵 | 7 |
1 | 0,5,7,3,2,7 | 收获第3棵 | 14 |
2 | 0,6,0,4,3,0 | 14 | |
3 | 0,7,0,5,4,0 | 收获第2棵 | 21 |
4 | 0,0,0,6,5,0 | 21 | |
5 | 0,0,0,7,6,0 | 收获第4棵 | 28 |
6 | 0,0,0,0,7,0 | 收获第5棵 | 35 |
…… | 0,0,0,0,0,0 | 35 |
【算法代码】
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+5;
int a[N],b[N],t[N];
LL ans;
int p;
int main() {
int n,k;
cin>>n>>k;
for(int i=1; i<=n; i++) {
cin>>a[i];
b[i]=k-a[i];
}
sort(b+1,b+1+n);
for(int i=k-1,j=n; i>=0; i--) {
while(j>=1 && b[j]>=i) {
p++;
t[p]=b[j];
j--;
}
if(p) {
ans+=k-t[p]+i;
p--;
}
}
cout<<ans<<endl;
return 0;
}
/*
in:
6 7
7 4 6 2 1 6
out:
35
*/