https://codeforces.com/contest/1525/problem/D
输入 n(≤5000) 和长为 n 的数组 a,其中只有 0 和 1。保证 1 的数量不超过 n/2。
a[i]=0 表示位置 i 处有一把椅子,a[i]=1 表示位置 i 处有一个人。
一把椅子只能坐一个人。
一个人从 i 移动到 j 的耗时为 abs(i-j)。
问所有人都坐到椅子上,所有人的耗时之和最小是多少?
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5010;
int a[N], b[N];
int f[N][N];
int n;
int main(){
cin >> n;
int idx1 = 0, idx2 = 0;
for(int i = 1; i <= n; i ++){
int x;
cin >> x;
if(x == 1) a[++idx1] = i;
else b[++ idx2] = i;
}
memset(f, 0x3f, sizeof f);
f[0][0] = 0;
for(int i = 1; i <= idx2; i ++) f[0][i] = 0;
for(int i = 1; i <= idx1; i ++){
for(int j = 1; j <= idx2; j ++){
f[i][j] = f[i][j - 1];
f[i][j] = min(f[i][j], f[i - 1][j - 1] + abs(a[i] - b[j]));
}
}
cout << f[idx1][idx2] << endl;
return 0;
}