[C++]日立製作所社会システム事業部プログラミングコンテスト2020解いてみた(A~B問題)

プログラミング

日立製作所社会システム事業部プログラミングコンテスト2020に参加しました。が、撃沈しました。A問題しか解けませんでした。

A – Hitachi String

問題

文字列 hi が1個以上繋がってできる文字列を、hitachi文字列と定義します。
例えば、 hihihiなどは hitachi文字列 であり、 hahiiは hitachi文字列 ではありません。
文字列Sが与えられるので、 Sがhitachi文字列 かどうかを判定してください。

自分の回答

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

int main() {
  string S;
  cin >> S;

  if(S == "hi" || S == "hihi" || S == "hihihi" || S == "hihihihi" || S == "hihihihihi"){
    cout << "Yes" << endl;
  }else{
    cout << "No" << endl;
  }
}

ゴリ押しです。

B – Nice Shopping

問題

この家電量販店では、 A種類の冷蔵庫とB種類の電子レンジが販売されています。 i番目(1≤i≤A)の冷蔵庫の値段はai円であり、 j番目( 1≤j≤B)の電子レンジの値段はbj円です。
また、あなたはM種類の割引券を所持しており、 i番目 (1≤i≤M)の割引券では、 xi番目の冷蔵庫 とyi番目の電子レンジを同時に買うと、 支払総額がci円安くなります。ただし、複数の割引券を同時に使うことはできません。
さて、あなたは冷蔵庫と電子レンジをちょうど1台ずつ買おうと思っています。かかる金額の最小値を求めてください。

自分の回答

#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int A, B, M;
  cin >> A >> B >> M;
  
  vector<int> reizouko{};
  vector<int> range{};
 
  for (int i = 0; i < A; i++) {
    int a;
    cin >> a;
    reizouko.emplace_back(a);
  }
  for (int i = 0; i < B; i++) {
    int b;
    cin >> b;
    range.emplace_back(b);
  }
 
  int MIN = 1000000;
  // 割引券を使わない場合の最小値。各ベクターの最小値を足し合わせれば良い
  int minimum = *min_element(reizouko.begin(), reizouko.end()) + *min_element(range.begin(), range.end());
 
  for(int i = 0; i < M; i++){
    int x, y, c;
    cin >> x >> y >> c;
    int money = reizouko[x-1] + range[y-1] - c;
    MIN = min(MIN, money);
  }
  // 割引券を使った時の最小値MINと使わなかった場合の最小値minimumを比べて、小さい方を出力する
  MIN = min(MIN, minimum);
  cout << MIN << endl;
}

方向性はすぐに定まったのですが、for文の中のMINを出すところを、MIN = min(minimun, money)として、ずっと正解できないまま、終了してしまいました。イージーミスですね。もったいない。

24行目で、割引券を使わなかった場合の最小値(mininum)を求めています。求めるためには各ベクターの最小値を足し合わせればいいです。
33行目で割引券を使った時の最小値MINと使わなかった場合の最小値minimumを比べて、小さい方を出力します。

タイトルとURLをコピーしました