zuka
ABCをコツコツ解いていきます。
本記事は,管理人の競技プロ精進日記としてログを取ったものです。モチベーションを爆上げするために,積極的にアウトプットしていく作戦です。
これから競技プログラミングを始めようと考えている人や,なんとなく敷居が高いと感じている人の参考になれば嬉しく思います。その他の記事は以下をご覧ください。
目次
本記事の概要
Atcoderで初心者用のコンテストとして開催されているAtcoder Beginner Contest(通称ABC)を解いていくものです。今回はABC152-B「Comparing Strings」です。
ポイント
辞書順で小さい順列を出力する問題です。しかし,順列同士を比較する必要はなく,$a$と$b$を比較した上で,$\min (a,b)$を$\max (a, b)$回繰り返した文字列をが常に辞書順で小さい文字列になっています。
実装上で気をつけるべきポイントもあります。main
関数の外でグローバルにchar
の配列を宣言すると,初期化をしなくても自動的に0で埋めてくれます。一方で,main
関数の中でchar
の配列を宣言して初期化をしないと,意味の分からない数字で初期化されてしまう恐れがあります。今回は,出力する文字列の配列をmain
関数の外で宣言する方法と,中で宣言する方法の2通りの実装を試してみました。
おさえるべき内容
main
関数の外でchar
の配列を宣言すると自動的に初期化される
main
関数の中でchar
の配列を宣言すると初期化されない(初期化マスト)
実装
#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;
// mainの外でcharの配列を宣言
// 初期化しなくても0に割り当ててくれる
char S[10];
int main(){
int a, b;
cin >> a >> b;
int c = min(a, b) + '0';
int d = max(a, b);
rep(i, d) S[i] = c;
cout << S << endl;
}
別解
#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;
int main(){
int a, b;
cin >> a >> b;
int c = min(a, b) + '0';
int d = max(a, b);
// mainの中でcharの配列宣言
char S[d];
// 初期化はマスト
rep(i, 10) S[i] = 0;
rep(i, d) S[i] = c;
cout << S << endl;
}
コメント