题目大意:有n个生命值为ai的随从,手里有无数张1费打1的法术,和一张0费“亵渎”,问消灭所有随从的最少费用是多少(我来给大家表演一下,教科书般的亵渎!)
1<=n<=2e5;
思路:我们想要费用最少,肯定要最大化亵渎的效果,因为如果两个随从相差x血,把他们变成等差数列的费用是x-1,而先亵渎的话费用是x,所以也就是要先让随从的生命值都排成等差数列,然后用亵渎消灭所有随从,那么我们把所有随从的生命值从小到大排序,然后从1开始找,找到当前要找的数,就去找+1的数,如果当前遍历的数比要找的数大,就消耗费用将它变成要找的数即可
//#include<__msvc_all_public_headers.hpp>
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
typedef long long ll;
ll a[N];
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
sort(a + 1, a + 1 + n);
ll now = 1;//当前要找的数
ll ans = 0;
for (int i = 1; i <= n; i++)
{
if (a[i] < now)
continue;//当前数比要找的小,不用动
else if (a[i] == now)
{//相等就去找下一个数
now++;
}
else
{//大于就改成要改的数
ans += a[i] - now;
now++;
}
}
cout << ans << endl;
}
return 0;
}