eijit's blog
  • Home
  • About
  • 正誤表
  • 動植物の参考情報
  • Categories
  • Tags
  • Archives

今日の一問 (2019/08/20 - 08/22)

Contents

  • 今日の一問 (2019/08/20 - 08/22)
    • 2019/08/20 ABC026-C
    • 2019/08/21 ABC112-C
    • 2019/08/22 ARC001-B

今日の一問を解いた。

以下のコードは PyPy3 (2.4.0), C++14 (GCC 5.4.1) で AC を確認している。

2019/08/20 ABC026-C

  • {上司の社員番号: [部下の社員番号, ...]} という連想配列を作る
  • 給料計算関数は設問の規則に従う
  • 給料計算関数に高橋君 (社員番号 1) を与える

として解いた。

# PyPy3 (2.4.0)
N = int(input())
B = []
for i in range(N-1):
    B.append(int(input()))

relation = ({1: []})
for i in range(N-1):
    if B[i] in relation:
        relation[B[i]].append(i + 2)
    else:
        relation[B[i]] = [i + 2]

def salary(relation, num):
    if num not in relation:
        return 1
    e = relation[num]
    if len(e) == 1:
        return 2 * salary(relation, e[0]) + 1
    salaries = [salary(relation, x) for x in e]
    return (max(salaries) + min(salaries) + 1)

ans = salary(relation, 1)
print(ans)

2019/08/21 ABC112-C

以前に Python で解いていたが、幸いなことに解法を忘れていたので新鮮な気持ちで取り組めた。賢い方法がわからなかったので、力技で全探索した。解いたあとで前回の Python の回答を見たら全探索だった。

// C++14 (GCC 5.4.1)
#include <iostream>
using namespace std;

int main()
{
    long long N;
    cin >> N;
    long long X[100], Y[100], H[100];
    for (long long i = 0; i < N; ++i) {
        cin >> X[i] >> Y[i] >> H[i];
    }

    for (int x = 0; x < 101; ++x) {
        for (int y = 0; y < 101; ++y) {
            bool found = true;
            long long h = -1;
            for (long long n = 0; n < N; ++n) {
                if (H[n] == 0) {
                    continue;
                }
                // 一つ候補を見つけて高さの基準にする
                h = H[n] + abs(X[n] - x) + abs(Y[n] - y);
                break;
            }

            // すべての高さが矛盾しないものを見つける
            for (long long n = 0; n < N; ++n) {
                const long long h_candidate = max(h - abs(X[n] - x) - abs(Y[n] - y), 0ll);
                if (H[n] != h_candidate) {
                    found = false;
                    break;
                }
            }
            if (found) {
                printf("%d %d %lld\n", x, y, h);
                return 0;
            }
        }
    }

    return 0;
}

2019/08/22 ARC001-B

これも賢い方法を思いつかなかったので、差が 10 度未満になるまで 10 度で調整して、残りはベタ書きした。

// C++14 (GCC 5.4.1)
#include <iostream>
using namespace std;

int main()
{
    int A, B;
    cin >> A >> B;

    const int diff = abs(A - B);

    int ans = 0;
    int remain = diff;
    if (remain >= 10) {
        const int count = remain / 10;
        remain -= count * 10;
        ans += count;
    }
    if (remain <= 2) {
        ans += remain;
    }
    if (remain == 3 || remain == 7 || remain == 8) {
        ans += 3;
    }
    if (remain == 4 || remain == 6 || remain == 9) {
        ans += 2;
    }
    if (remain == 5) {
        ans += 1;
    }

    printf("%d\n", ans);

    return 0;
}

Published

Aug 29, 2019

Category

Programming

Tags

  • AtCoder 7
  • ProgrammingContest 7

Contact

  • Powered by Pelican. Theme: Elegant