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);
}
posted @ 2022-10-26 14:18  ycllz  阅读(20)  评论(0)    收藏  举报