Educational Codeforces Round 97 (Rated for Div. 2) C
C. Chef Monocarp
我们不好发现任何性质
直接暴力
我们看到n=200可以想到是n3的dp
显然dp[i][j]表示前i个且第i个放在j位置的min
显然可以O(n)转移 这道题就做完了
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
const int M = 998244353;
const int mod = 998244353;
#define int long long
int up(int a,int b){return a<0?a/b:(a+b-1)/b;}
#define endl '\n'
#define all(x) (x).begin(),(x).end()
#define YES cout<<"YES"<<endl;
#define NO cout<<"NO"<<endl;
#define _ 0
#define pi acos(-1)
#define INF 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int dp[210][310];//前i个物品第i个放在j的位置上的min
void solve() {
int n;cin>>n;
vector<int>a(n+1);
for(int i=1;i<=n;i++)cin>>a[i];
sort(all(a));
memset(dp,0x3f3f,sizeof dp);
int ans=INF;
dp[0][0]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n+100;j++){
for(int k=i-1;k<j;k++){
dp[i][j]=min(dp[i][j],dp[i-1][k]+abs(j-a[i]));
if(i==n)ans=min(ans,dp[i][j]);
}
}
}
cout<<ans<<endl;
}
signed main(){
fast
int t;t=1;cin>>t;
while(t--) {
solve();
}
return ~~(0^_^0);
}