引き続き、過去問をC++でB問題を解いていきます。
ABC B062 – Picture Frame
問題
縦Hピクセル、横Wピクセルの画像があります。 各ピクセルは英小文字で表されます。 上からi番目、左からj番目のピクセルはaijです。
この画像の周囲1ピクセルを#
で囲んだものを出力してください。
自分の回答
#include <bits/stdc++.h>
using namespace std;
int main () {
int H, W;
cin >> H >> W;
// フレームの作成
string frame = "";
for(int i = 0; i < W + 2; i++){
frame += "#" ;
}
// 上辺のフレーム
cout << frame << endl;
for(int i = 0; i < H; i++){
string image;
cin >> image;
cout << "#" << image << "#" << endl;
}
// 下辺のフレーム
cout << frame << endl;
}
まずは、上下に差し込む為の”#”のフレームを作成しています。長さはW+2となることに注意しましょう。
画像の部分は前後に”#”を差し込んで出力するようにすればいいですね。
ABC B063 – Varied
問題
英小文字からなる文字列Sが与えられます。Sに含まれる文字がすべて異なるか判定してください。
自分の回答
#include <bits/stdc++.h>
using namespace std;
int main() {
string S;
cin >> S;
string S_origin = S;
sort(S.begin(), S.end());
S.erase(unique(S.begin(), S.end()), S.end());
if(S.size() == S_origin.size()){
cout << "yes" << endl;
}else{
cout << "no" << endl;
}
}
重複する文字を削除して、文字数を確認して分岐させればいいですね。
もし、重複する文字を削除した前後で文字数が変わらなければ、重複する要素がないということなので、”yes”を出力すればいいです。
sort関数などは破壊的メソッドなので、関数をかけた後、Sは変わってしまうので、S_originに元の文字列を格納しておきます。
ABC B064 – Traveling AtCoDeer Problem
問題
クリスマスもあと半年となり、トナカイのAtCoDeer君はプレゼントを配る計画を立てることにしました。
TopCoDeer通りにはN個の家が並んでいます。i個目の家は座標aiにあります。彼はこのすべての家にプレゼントを配ることにしました。
好きな場所から開始し好きな場所で終了することができる時、最小の移動距離を求めなさい。
自分の回答
#include <bits/stdc++.h>
using namespace std;
int main () {
int N;
cin >> N;
// 座標データを格納する為のベクターの宣言
vector<int> P(N);
for(int i = 0; i < N; i++){
int a;
cin >> a;
P[i] = a;
}
// ベクターP内の最大値と最小値を引いて、出力する
cout << *max_element(P.begin(), P.end()) - *min_element(P.begin(), P.end()) << endl;
}
なんて事はない、与えられる座標の中の最大値と最小値を引いた値が答えとなります。