一个 1×n 的棋盘,按照如下方式放置石子:
放置在距离其他石子距离和最小的位置。
若存在多个满足条件1的位置,选择下标第 k 小的位置。若下标第 k 小的位置不存在,则选择下标最大的位置。
求放置完成后第 m 个位置的石子是在第几次被放置的。
求一个时间复杂度尽可能低的解法(如果这个问题没有比暴力更低复杂度的解法可以指出)
附暴力代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[2000];
int b[2000], blen, bmax;
int n, m, k;
int main() {
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= n; i++) {
bmax = -1145141919;
for (int j = 1; j <= n; j++) {
if (a[j]) continue;
int sum = 0;
for (int l = 1; l <= n; l++) {
if (a[l]) {
sum += abs(l - j);
}
}
if (sum > bmax) {
bmax = sum;
blen = 1;
b[1] = j;
}
else if (sum == bmax) {
b[++blen] = j;
}
}
if (blen < k) {
a[b[blen]] = i;
}
else {
a[b[k]] = i;
}
}
printf("%d", a[m]);
return 0;
}