Bを埋めたよ
お疲れカシューナッツ!!! 天才!! 偉い!よくやった!! 今日解いたBは23問らしいです!! ぷは~ 疲れたにゃん!! 今回の記事で伝えたいことは 「B梅頑張った!」 ってことです。以下はおまけなので読まなくていいです。
詰まった問題/知見を得られた問題
ABC001単純にだる
ABC003 良問
ABC010 割った余りで場合分け。考察がいるので多分良い問題
ABC013B 詰まってはないけどいい問題
ABC014 Bでbitかよって思うけど、bitの練習としては良
ABC027 くっそむずい。けど解けた。偉いいやこれ本当にBか?
ABC028 はわわ。文字列中の文字の数え上げ何てできるのか!!って感じ
ABC001 B-視程の通報
コメント
めんどっち, WA 出した(は?)
2 WA でた。(は??????)
3 WA 出た!!(泣きたい)
結論
旧ABCに圧倒的敗北
条件を分けるだけなのですがめんどくさい問題ですね。
僕は0を足して出力はprintfは使わずに0を直で出力させました。
ABC003 B-AtCoderトランプ
コメント
WA 出した。(は?)
めんどくちい!!
vimを使って問題を解く練習にはなるかもしれない
これれも条件分岐するだけ
いやまあ、解説に書かれていることを実装した。
文字をキーとする配列を作って、
S[i] != T[i]のとき、
mapに atcoder のどれかなら 1点
@なら10点っていう配列を作っておく。
で、それが11点以上ならokっていうことを実装するとカッコいいです
ABC006B-トリボナッチ数列
コメント
漸化式立てるだけ。
再帰関数を用いるまでもない。
この段階から割った余りを出力する問題が出るなんていがい。
ABC009B- 心配性な富豪、ファミリーレストランに行く。
コメント
2番目に真に高いものを出力する。
これは、1番高いものの値段を覚えてもらい、降順にソート、ループを回して一番高いものと同じじゃない値段だったら出力して終了。
もしくは重複を削除(leftunique)してもいいね
#include <bits/stdc++.h> using namespace std; using ll =long long; #define SORT(a) sort((a).begin(),(a).end()) #define rSORT(a) reverse((a).begin(),(a).end()) #define For(i, a, b) for(int i = (a) ; i < (b) ; ++i) #define rep(i, n) For(i, 0, n) #define debug(x) cout << #x << " = " << (x) << endl; #define leftunique(a) {SORT(a);(a).erase(unique((a).begin(),(a).end()),(a).end());} const ll INF = 1LL << 60; ll N,M,H,W,K,A,B; string S; //Write From this Line int main() { cout << setprecision(10); cin >> N ; vector<ll> V(N); rep(i,N) cin >> V[i]; leftunique(V); rSORT(V); cout << V[1] << endl; }
ABC010B-花占い
コメント
全部1枚にすればいいじゃないか。っていって花びらむしりとりまくったらWA吐かれた。
ゆるせなあい!!
花びらの枚数を6で割った余りで場合分け。
ABC011B - 名前の確認
コメント
a からAにする変換を作っておく
0文字目が小文字ならその変換を施す
i (!=0)文字目が大文字ならそれと逆の変換を施す。
ASCIIコードを使った文字変換はできるようにならないといけない。
少し説明をすると
整数'A' - 'a' の値を 'a'に+すると、'A'が求まる、
整数'A' -'a'の値を'c' に+すると'C'が求まります。
これはASCIIコードでは、大文字が先か小文字が先かは知らないけど、
とりあえずabcdefg...z
ABCD....Zという風に並んでいるから。
逆に、その値を引いてやれば、 'C' を'c'にできる
これを見ると実際にはABC... abcの順で、小文字のほうがあとなんだね。直感に反する
ABC012B- 入浴時間
コメント
0埋め。printfを使いましょう。
秒数から時間への変換そんなに見かけないけど過去問やってたらたまに見かけるよね。
1時間3600秒
1分60秒
っていうのをうまく使って、何時間、何分、何秒を取得しよう。
ちょっとしたヒントっぽいことを言うと、秒数は与えられた時間を60で割った余りだね。
ABC013B- 錠
コメント
めちゃくちゃ早くけた
例9 から5にする
これは-を繰り返して5にするのが良くて、答えは4
操作方法は2通りあり
-を4回か
+を6回
この4と6っていう数字は、
9と5の小さい方に10を足した値(15)と、操作してないほう(9)の差の絶対値6
と、単純な9と5の絶対値の差。
これに気づけばその二つのminを取ればいい。
ABC014-価格の合計
コメント
え!?Bってbit!?!?って感じ。
bit使えない。
調べた。
解けた
天才かもしれない。
bitset<bitの数> 変数名(二進数にする値、もしくは二進数そのもの)
flagが経っているかどうかは
name.test(i) iは調べる位置
bit学び始めとして良い問題だと思う。
ABC018B- 文字列の反転
コメント
substringを使わないとやってられない
substringの使い方を復習しておこう
文字列Sに対して
S.substr(i,k)で、Sのi番目の要素からk個の要素を取り出してる
i,kでi番目の要素からk番目の要素じゃないことに注意されたし。
ABC020B-足し算
コメント
やっと簡単な問題が出てきた…(abc のB問題の若い番号から埋めていっている)
文字列にaとbを入れて、
それをつなげる。つなげたものを整数型に変換して2倍して出力。
ABC021B-うそつきの高橋君
コメント
そして信用を失った高橋君はAtC****社をやめた。
辞めてないんだよな。
この問題、別に難しいことを言っていなくて、
K個与えられる街について、a,b以外の数字が1回ずつ出てきているのならそれでいい。
mapで管理できる。
出てくるごとに+1, 1以上になったらNOを出力
負の重みのないグラフにおいては、
・ある最短経路に現れる頂点はすべて異なる
・最短経路は閉路を持たない
という知見が得られるらしい(よくわからんけど)
ABC022B- Bumble Bee
コメント
高橋君は蜂だったんですね。。。
赤コーダーの蜂。
強そう
最初にある花の種類が出てきたら、その花の種類のmapの価値をtrueにした。
その後同じのが出てきたらmap[花の種類]は存在しているので+1
という風にしていたが、よく考えたらそんなことはしなくてもよかった。
解説に書いてあって気づいたことだけど、出てくる花の種類を数えればよくて、
3種類出てくるのであれば、3種類の最初に蜜を吸う3つは受粉しないのでN-3が答えになる
確かにそうじゃん…
ABC024B- 自動ドア
コメント
似たような問題をつい最近やった気がする。
そうだ、水の流れる時間の問題だ。
これと全く同じ解法で解くことが出来る。
今回は前回やったときの解説を意識して、
扉が閉まる前に人が通るかどうか。みたいなことをやったよ
ABC025B-双子とスイカ割り
コメント
操作方法が単純で、Aより小さいならAメートル歩く
Bより大きいならBメートル歩くとなっているので、
距離が与えられた時点でAか、Bか、もしくはその間に変換してしまえばいい。
あとは,僕の場合はEastを正の方向に歩く、Westを負の方向に歩くとして実装した。
最終的な座標が負ならWest 正ならEast を出力して、最終座標も出力する
ABC027B-島と橋
コメント
カレーを作るよりも難しい
え、なにこれww
むずいwww
ま、ACしたんですけどね(あはは)
まずはWAの解法から。
まず、等しい人数にできるとき、
その人数をhope とする
で、左から順にみていってhopeよりも多ければ右にはみ出した分を上げる。
で、ひっくり返してまたはみ出した分を左に送る。みたいなことしてけばいけるんじゃないかな?って思ったけど無理だった
AC解法
たとえば島が7個
1 2 3 2 1 2 3
のとき、hope = 2;
で、橋は
まず左の1 ,2 , 3をつなげる用に。
そして次に 右側の1, 2,3
でつなげるように。みたいなことを実装しました。
つまり、ある区間について、島の個数 * hope がある区間の人の合計値 と一致すれば、そこの間で橋を架ける。みたいなノリです!!で、この時に架ける橋の数は、その区間の島の数-1です。
橋を架けたらそのあとは、橋を架ける必要がある島まで移動(つまり、島にいる人の数がhopeの場所同士はくっつけなくていい)
こうすることで、左側からの 1 , 2, 3 はつなげるけど、
1 , 2, 3 , 2,の強調表示した2までは橋で繋げられないようにできて、
さらに、次に橋を架けるのは1, 2, 3, 2, 1 ,2 ,3の強調表示した1から、という風にすることが出来るよ。
すごい!!
大変な問題でござった。
解説は天才だというお話
解説では、左から橋を置く必要があるかを判定する。
ある島iについて、その島も含めた左側の人数の合計がi * hope になっていれば、その島とその右隣の島に橋を架ける必要はない。
みたいなことをしている。頭いいな…
ABC028B -文字数カウント
コメント
えへへ~
実装力お化けだぞ~~♡
3秒AC(嘘)
空白を付けずに出力しろ?うるせえなあ!!!!
って感じだった。
まず出てきた回数を保持するための配列を用意する。
Sのi文字目から'A'(ASCIIを使え)を引いた値の配列の要素番号に+1するって感じでやれば
Aができた回数は配列[0]に,Fが出てきた回数は配列[6]に入るようになる。
まあ連想配列でも解けそうだけどね。
解説解答(コードはc++)
int main(){ cin >> S; string AF = "ABCDEF"; int c[6]; rep(i,6){ c[i] = count(S.begin(),S.end(),AF[i]); } string result = to_string(c[0]); for(int i = 1 ;i < 6 ; i++){ result += " " + to_string(c[i]); } cout << result << endl; }
は?神かよ。
C++ には、文字列中のある文字をカウントする関数があるんだってよ。
count(S.begin(),S.end(),'A')で文字列中のAの個数を数えれるんだって。知らんかったわ。
ABC033B - 町の合併
コメント
過半数っていうのはねぇ…半分を含まないんだねえ…
問題自体はそんなに難しくないと思う。
ABC035B -ドローン
僕の手にかかればこんなの朝飯前さ
(拡大表示する場所ミスった・・・)
いやそんなことはないコーナーに気づいた俺は偉い。
これさ、マンハッタン距離と?の数を比較して、はてなの数が多いときにちょっとやっかいなんだよね。
最大のほうはドローンを遠くに飛ばせばいいんっだけど、最小のときに厄介。
?を使って距離0までやった後、残りの?が1なら距離は1になる
みたいな感じで、残りの?(これは?の数からマンハッタン距離を引いた値)が2で割れれば0
そうでなきゃ1
ABC036B- 回転
コメント
実装ゲ~
添え字がんばれ。頑張れ。ってだけ。かな…
まあ大変
この回から解説がPDFで貼られるようになった
ABC037B -編集
コメント
これ、制約厳しくなったらどうするんだろうって思った。
L,Rの中身の添え字に注意しよう
具体的に言うと、Lは一減らす
R はそのまま
ってやって for(int j = left ; j < right ; j++)のループの中で配列の中身を置き換える。
でもまあこれは、なんか最後に変化されるところだけ把握するって感じでやるのが難しい問題だったらありそうだね。
ちなみに解説は本当に愚直にやっていくだけだった(愚直って何)
ABC038B ディスプレイ
コメント
入力が4つ与えられる。
a,b,c,dとして、aがc,dのどっちか
bがc,dのどっちかと等しければYES
そうでなければNO
ABC040B -□□□□□□
コメント
ちょっとめんどくさい問題
なんかテキトに実装してたらできてしまった。