【競プロ精進ログ】ABC123-B

zuka

ABCをコツコツ解いていきます。

本記事は,管理人の競技プロ精進日記としてログを取ったものです。モチベーションを爆上げするために,積極的にアウトプットしていく作戦です。

これから競技プログラミングを始めようと考えている人や,なんとなく敷居が高いと感じている人の参考になれば嬉しく思います。その他の記事は以下をご覧ください。

目次

本記事の概要

Atcoderで初心者用のコンテストとして開催されているAtcoder Beginner Contest(通称ABC)を解いていくものです。今回はABC123-B「Five Dishes」です。

ポイント

やや実装に悩む問題です。問題文を読むと,「調理時間が(10の倍数の料理を除いて)一の位が一番小さい料理を最後に頼めばよい」ということに気づくと思います。しかし,そのような処理を各料理ごとに行なうのは少し面倒です。そこで,今回は全ての注文順を試す全探索を行いたいと思います。

ここで,c++ではnext_permutationを利用すれば簡単に全ての注文順を列挙することができます。詳しくは以下の記事などをご覧ください。

おさえるべき内容

 全探索できるときは全探索した方が楽チン

実装

#include <bits/stdc++.h>
#define _GLIBCXX_DEBUG
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define repi(i, a, b) for (int i = (int)(a); i < (int)(b); i++)
using namespace std;
typedef long long ll;

int A, B, C, D, E;

int main(){
  cin >> A >> B >> C >> D >> E;
  // next_permutationする配列
  int X[5] = {A, B, C, D, E};
  // 答えの初期値は適当に大きい値に定めておく
  int ANS = 200*5;

  // 各順列に対する実行部分
  do{
    int ans = 0;
    rep(i, 4){
      // もし調理時間が10の倍数でなければ次にくる10の倍数を足す
      // すなわち調理時間に10-(10で割ったあまり)を足す
      if (X[i] % 10 != 0){
        ans += X[i] + (10 - (X[i] % 10));
      }
      // もし調理時間が10の倍数であればそのまま足す
      else ans += X[i];
    }
    // 最後の料理は調理時間をそのまま足す
    ans += X[4];
    ANS = min(ANS, ans);
  }
  // 順列を並び替える
  while (next_permutation(X, X+5));

  cout << ANS << endl;
}
よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

※ Please enter your comments in Japanese to distinguish from spam.

目次