日立製作所社会システム事業部プログラミングコンテスト2020に参加しました。が、撃沈しました。A問題しか解けませんでした。
A – Hitachi String
問題
文字列 hi
が1個以上繋がってできる文字列を、hitachi文字列と定義します。
例えば、 hi
やhihi
などは hitachi文字列 であり、 ha
やhii
は 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を比べて、小さい方を出力します。