提出 #64680756


ソースコード 拡げる

#include <bits/stdc++.h>
using namespace std;

#define rep(i, n) for (long long i = 0; i < (n); i++)

// #define DEBUG

const int MAX_N = 15;

long long X[MAX_N], Y[MAX_N];
long long N, K;
long long ans = LONG_LONG_MAX;

// K < N なのでNで初期化しちゃう
vector<int> points[MAX_N];

long long findMaxDist()
{
    long long maxDist = 0;
    // 最大距離を求める処理
    for (int id = 0; id < K; id++)
    {
        auto group = points[id];

        if (group.size() < 1)
        {
            // 1点の場合、距離はない
            continue;
        }

        // 距離を求める
        for (int i = 0; i < group.size() - 1; i++)
        {
            for (int j = i + 1; j < group.size(); j++)
            {
                int p1 = group[i];
                int p2 = group[j];
                long long dx = X[p1] - X[p2];
                long long dy = Y[p1] - Y[p2];
                long long dist = dx * dx + dy * dy;
                maxDist = max(dist, maxDist);
            }
        }
    }
    return maxDist;
}

void dfs(
    int n,     // 点の番号
    int k,     // 今使っている箱の数
    int target // 入れたい箱の番号
)
{
    // 存在しない箱なので終了
    if (K <= target)
    {
        return;
    }

    // K - k 未使用の箱
    // N - n + 1 残りのボール数
    // どんな入れ方でも条件を満たさない
    if (N - n + 1 < K - k)
    {
        return;
    }

    // 箱iに点を追加
    points[target].push_back(n);

    if (n + 1 == N)
    {
        if (k == K)
        {
            long long maxDist = findMaxDist();
            ans = min(ans, maxDist);
        }
    }
    else
    {
        // 箱の数は変えずに、次の点を今までの箱に追加
        for (int j = 0; j <= k; j++)
        {
            dfs(n + 1, k, j);
        }

        // 新しい箱を用意して投入
        dfs(n + 1, k + 1, k);
    }

    //  上の階に戻るので、入れた値を削除
    auto it = lower_bound(
        points[target].begin(),
        points[target].end(),
        n);

    points[target].erase(it);
}

int main()
{
#ifdef DEBUG
    freopen("input/in.txt", "r", stdin);
#endif

    cin >> N >> K;
    rep(i, N)
    {
        cin >> X[i] >> Y[i];
    }

    // 0の点を0の箱に追加
    dfs(0, 1, 0);

    cout << ans << endl;

    return 0;
}

提出情報

提出日時
問題 045 - Simple Grouping(★6)
ユーザ sbknk
言語 C++ 20 (gcc 12.2)
得点 6
コード長 2493 Byte
結果 AC
実行時間 658 ms
メモリ 3504 KiB

コンパイルエラー

Main.cpp: In function ‘long long int findMaxDist()’:
Main.cpp:32:27: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
   32 |         for (int i = 0; i < group.size() - 1; i++)
      |                         ~~^~~~~~~~~~~~~~~~~~
Main.cpp:34:35: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
   34 |             for (int j = i + 1; j < group.size(); j++)
      |                                 ~~^~~~~~~~~~~~~~

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 6 / 6
結果
AC × 4
AC × 21
セット名 テストケース
Sample sample01.txt, sample02.txt, sample03.txt, sample04.txt
All dense00.txt, dense01.txt, dense02.txt, dense03.txt, mid_random00.txt, mid_random01.txt, mid_random02.txt, mid_random03.txt, mid_random04.txt, mid_random05.txt, random00.txt, random01.txt, random02.txt, random03.txt, random04.txt, random05.txt, random06.txt, sample01.txt, sample02.txt, sample03.txt, sample04.txt
ケース名 結果 実行時間 メモリ
dense00.txt AC 16 ms 3372 KiB
dense01.txt AC 17 ms 3376 KiB
dense02.txt AC 1 ms 3460 KiB
dense03.txt AC 14 ms 3456 KiB
mid_random00.txt AC 17 ms 3372 KiB
mid_random01.txt AC 1 ms 3368 KiB
mid_random02.txt AC 1 ms 3440 KiB
mid_random03.txt AC 1 ms 3500 KiB
mid_random04.txt AC 469 ms 3396 KiB
mid_random05.txt AC 1 ms 3464 KiB
random00.txt AC 102 ms 3488 KiB
random01.txt AC 17 ms 3460 KiB
random02.txt AC 658 ms 3488 KiB
random03.txt AC 2 ms 3460 KiB
random04.txt AC 14 ms 3468 KiB
random05.txt AC 1 ms 3492 KiB
random06.txt AC 7 ms 3496 KiB
sample01.txt AC 1 ms 3504 KiB
sample02.txt AC 1 ms 3440 KiB
sample03.txt AC 13 ms 3456 KiB
sample04.txt AC 1 ms 3504 KiB