题目链接
题意:n个数字{ a 1 , a 2 , . . . , a n } \{a_1,a_2,...,a_n\}{a1,a2,...,an},i ii放到位置的花费为a b s ( i − a j ) abs(i−a_j)abs(i−aj),求放置所有数字的最小花费。
思路:经典背包
#include <bits/stdc++.h>
#define pcc pair<char, char>
#define pii pair<int, int>
#define vi vector<int>
#define vl vector<ll>
#define rep(i, x, y) for (int i = x; i < y; i++)
#define per(i, x, y) for (int i = x; i >= y; i--)
#define rep0(i, n) for (int i = 0; i < (n); i++)
#define per0(i, n) for (int i = (n)-1; i >= 0; i--)
#define mp make_pair
#define pb push_back
#define F first
#define S second
#define sz(x) (x).size()
#define all(x) (x).begin(), (x).end()
#define ll long long
#define ull unsigned long long
#define db double
#define ld long double
using namespace std;
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
const double eps = 1e-9;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 10;
const int MAX = 1e5;
const double pi = acos(-1.0);
const ll INF = 0x3f3f3f3f3f3f3f;
ll qpow(ll a, ll b) {
ll res = 1;
while (b) {
if (b & 1) res = (res * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return res % mod;
}
/***************main****************/
ll T = 1;
ll m, n;
ll a[maxn], dp[maxn];
int main() {
T = read();
while (T--) {
n = read();
rep(i, 1, n + 1) a[i] = read(), dp[i] = inf;
sort(a + 1, a + n + 1);
rep(i, 1, 2 * n + 1) {
for (int j = n; j > 0; j--) dp[j] = min(dp[j], dp[j - 1] + abs(a[j] - i));
}
cout << dp[n] << endl;
}
return 0;
}
版权声明:本文为farer_yyh原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。