Problem - 1810C - Codeforces
对于一个全排列,我们不得不做的事情就是将整个排列中全部相等的数字删掉,这是无法避免的。
接下来,我们需要考虑这样一个问题,那就是什么样的全排列代价最小,很明显,我们需要枚举每一个存在于全排列中的数字,计算最小的一个代价值。
代价值的计算:
代价值无非就是增加和删除,对于每个特定的数字,我们需要删除所有大于他的数字,增加所有小于他但不在排列中的数字。我们不需要具体枚举需要增加或减少哪个数字,因为我们只需要计算代价的大小,因此我们只需要n-i表示大于他的数。ai-i表示比他小的数字需要增加多少个。
好了,别忘了,还有一种可能,那就是全部删除然后加1。
看代码。
#include <iostream>
#include <algorithm>
using namespace std;
#define int long long
const int N = 200005;
int a[N];
signed main() {
int TT;
cin >> TT;
while (TT--) {
int n, c, d;
cin >> n >> c >> d;
for (int i = 1; i <= n; ++i) cin >> a[i];
int res = d * 1 + c * n;
sort(a + 1, a + n + 1);
int len = unique(a + 1, a + n + 1) - a - 1;
for (int i = 1; i <= len; ++i) res = min(res, c * (n - i) + d * (a[i] - i));
cout << res << '\n';
}
return 0;
}