📄
ABC274 終了レポ
環境
- 言語:C++
- 環境:VSCode + WSL
余談ですがC++初のコンテストになります
結果
- 三完撤退(A-B-C)
- miss - 0
- rank - 4536 / 8252
- Rate - 20(+20)
終了直後レポ
A - Batting Average
- a,bを小数で受け取る
- b÷aする
- 小数点第四位で四捨五入
- 上から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
- 二次元配列に格納
- 縦列ごとに#をカウント
あんま関係ないけどスペース区切り出力ができなくてあわあわしてた
#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
- vecに分裂したアメーバリストを格納
- 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