一道突然想到的题目,但我不会做
  • 板块学术版
  • 楼主251Sec
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/9/1 20:25
  • 上次更新2023/10/27 12:52:01
查看原帖
一道突然想到的题目,但我不会做
363415
251Sec楼主2022/9/1 20:25

一个 1×n1\times n 的棋盘,按照如下方式放置石子:

  1. 放置在距离其他石子距离和最小的位置。

  2. 若存在多个满足条件1的位置,选择下标第 kk 小的位置。若下标第 kk 小的位置不存在,则选择下标最大的位置。

求放置完成后第 mm 个位置的石子是在第几次被放置的。

求一个时间复杂度尽可能低的解法(如果这个问题没有比暴力更低复杂度的解法可以指出)

附暴力代码:

#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;
}
2022/9/1 20:25
加载中...