TakahiroNakamori

TakahiroNakamori

中森崇博(ナカモリタカヒロ)

08 /
30
2021
 

【ABC216-Aの反省】 上位者のコードを見て、早くACする

2021年8月29日に開催された AtCoder Beginner Contest 216(ABC216) に参加しました。

AtCoder Beginner Contest 216 – AtCoder
プログラミング初級者から上級者まで楽しめる、競技プログラミングコンテストサイト「AtCoder」。オンラインで毎週開催プログラミングコンテストを開催しています。競技…

結果は以下の通りでした。

ここではA問題について復習します。

A問題について

問題等は以下のリンクをご確認ください。

A – Signed Difficulty
プログラミング初級者から上級者まで楽しめる、競技プログラミングコンテストサイト「AtCoder」。オンラインで毎週開催プログラミングコンテストを開催しています。競技…

ポイントは X.Y という形式で受け取って、X と Y を分けなければならない点です。

コンテスト中に思いついたのは、以下の2つです。

  1. 文字列で受け取って、”.” で区切って X と Y に分ける。
  2. 数値で受け取って、四則演算を駆使して X と Y に分ける。

小数は整数にして考えるという思考が根強く残っていた自分は、数値で受け取って進めました。

実際にACしたコードは以下になります。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using P = pair<int, int>;
#define rep(i, n) for (int i = 0; i < (n); ++i)
// const int mod = 1000000007;
// const ll INF = 1LL<<60;
// const int INF = 1001001001;

int main() {
  double v;
  cin >> v;

  int x = v / 1;
  double y = (v * 10) - (x * 10);

  if (0 <= y && y <= 2) {
    cout << x << "-" << endl;
  } else if (3 <= y && y <= 6) {
    cout << x << endl;
  } else {
    cout << x << "+" << endl;
  }

  return 0;
}

ACしたからいいものの、なんか面倒なことしとる感が強い。

整数で考えようとしているのに、15行目で double y としているところはまぁ、置いておいて…。

そこで、早くACされた方々のコードを見させてもらったら、やっぱりスマートな方法があった。

入力の受け取りを工夫する

早くACされた方々のコードを見させてもらって、ACしたコードは以下になります。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using P = pair<int, int>;
#define rep(i, n) for (int i = 0; i < (n); ++i)
// const int mod = 1000000007;
// const ll INF = 1LL<<60;
// const int INF = 1001001001;

int main() {
  int x, y;
  scanf("%d.%d", &x, &y);

  cout << x;
  if (0 <= y && y <= 2) {
    cout << "-";
  } else if (7 <= y && y <= 9) {
    cout << "+";
  }
  cout << endl;
  return 0;
}

入力の受け取りを cin ではなく、scanf を使っています。

小数の値を出力するときに、printf を使う場合がありますが、その入力版と考えたらいいと思います。

確かにこの方法だと、自分が考えた上記2つの方法より手数、というか気にしないといけないことが少なそうです。

書き方が若干クセありますが、この方法だと早くACできそうだなぁ、機会があれば使ってみます。