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

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関数の外で定義された変数は,コンパイル時にメモリが割り当てられるため0で初期化することが可能です。一方で,main関数の中で定義された変数は,実行するごとに異なるメモリに割り当てられるため,自動的に0で初期化をすることができない仕組みになっています。(参考:Why are global variables always initialized to ‘0’, but not local variables?

おさえるべき内容

 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;
}
よかったらシェアしてね!

コメント

コメントする

目次
閉じる