📄

ABC274 終了レポ

2022/10/22に公開

環境

  • 言語:C++
  • 環境:VSCode + WSL

余談ですがC++初のコンテストになります

結果

  • 三完撤退(A-B-C)
  • miss - 0
  • rank - 4536 / 8252
  • Rate - 20(+20)

終了直後レポ

A - Batting Average

  1. a,bを小数で受け取る
  2. b÷aする
  3. 小数点第四位で四捨五入
  4. 上から4文字を出力

小数の扱いに慣れてないこともあって普通に混乱した
roundの扱いがわからなくてパワーで有効桁実装したけどこれでいいのかな

#include <bits/stdc++.h>
using namespace std;
#include <atcoder/all>
using namespace atcoder;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rep1(i, n) for (int i = 1; i < (int)(n+1); i++)

void Main() {
  double a, b;
  cin >> a >> b;
  
  string s = to_string(round(b / a * 1000) / 1000);
  rep(i, 5) cout << s.at(i);
  cout << endl;
}

int main() {
  Main();
}

B - Line Sensor

  1. 二次元配列に格納
  2. 縦列ごとに#をカウント

あんま関係ないけどスペース区切り出力ができなくてあわあわしてた

#include <bits/stdc++.h>
using namespace std;
#include <atcoder/all>
using namespace atcoder;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rep1(i, n) for (int i = 1; i < (int)(n+1); i++)

void Main() {
  int h, w;
  cin >> h >> w;
  vector<vector<char>> vec(h, vector<char>(w));
  rep(i, h) rep(j, w) cin >> vec.at(i).at(j);
    
  
  vector<int> ans(w, 0);
  rep(i, w) rep(j, h) {
    if(vec.at(j).at(i) == '#') ans[i]++;
  }

  rep(i, w) {
    cout << ans[i];
    if(i < w-1) cout << " ";
  }
  cout << endl;
}

int main() {
  Main();
}

C - Ameba

  1. vecに分裂したアメーバリストを格納
  2. ansの値を都度更新することで各アメーバの深さを記録

最初「2iと2i+1に分裂」が「2kと2k+1に分裂」に見えてリアル10分くらい混乱した
Cにしては優しめ?な感触

#include <bits/stdc++.h>
using namespace std;
#include <atcoder/all>
using namespace atcoder;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rep1(i, n) for (int i = 1; i < (int)(n+1); i++)

void Main() {
  int n;
  cin >> n;
  vector<int> vec(n);
  rep(i, n) cin >> vec.at(i);

  vector<int> ans(n*2+1);
  ans.at(0) = 0;

  rep1(i, n) {
    // 2i
    ans.at(i*2-1) = ans.at(vec.at(i-1)-1) + 1;
    // 2i+1
    ans.at(i*2) = ans.at(vec.at(i-1)-1) + 1;
  }

  rep(i, 2*n+1) cout << ans.at(i) << endl;
}

int main() {
  Main();
}

解説と比較

A - Batting Average

前提として、coutでは出力時に数値も文字列になるっぽい(character outputだしね)

それを踏まえて、

cout << fixed << setprecision(N) << d;

とすることで「dの小数点以下N桁のみ表示し、それ以下は四捨五入」することができる
ちなみに私が用いた方法(x10^表示桁 > 小数点第一位で四捨五入 > ÷10^表示桁)も立派に「誤差をなくす方法」として紹介されていたため、れっきとした正攻法であった(ふふん)

余談だが、round()や上記の方法では実際の四捨五入と若干の誤差があるらしい(前者がより正確であるため)

B - Line Sensor

省略

C - Ameba

省略

総評

C++実践として挑んだけど、ノーミス三完と上々のスコアで満足です
pythonとかkotlinと比較してコードは煩雑になりがちだけど、そのぶん関数仕様が~とかの理由でバグを生むことが少なくて軌道修正が楽(まだC++の関数に慣れてないだけかも)

別府旅行中なので銭湯入って寝ます では

Discussion