7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

競プロガチ初心者がABCを解いてて解けなかった問題を貼り付けていく

Last updated at Posted at 2020-03-11

始めに

ABC解放がわからなかった問題を考えと一緒に貼っつけて行くだけの備忘録のなり損ねです。もっといい解法あるお!とかあったら教えていただけると嬉しい…!嬉しい…!
※競プロをやっていらっしゃる他の方々と比べて、当方かなり発想が貧弱ですので、温かい目で見ていただけると幸いです。

128-B

解説PDF
pair型を使うとかいてある。おん?

pairは、2つの異なる型の値を保持する「組」を表現するためのクラスである。インクルードは<map>

pair<型,型> 名前でpair型変数を宣言してこれにmake_pair(型変数,型変数)でpair型の組をぶち込んだ後に、pairがならんだ配列Aをsort(A, A+要素の数)することで左の要素から順に昇順ソートする。なるほどな。

B.cpp
  int N;
  pair<pair<string, int>, int> p[110];

  cin >> N;
  rep(i, N){
    //一回一回nameとscoreを代入した後pairにぶち込む
    string name;
    int score;
    cin >> name >> score;
    p[i] = make_pair(make_pair(name, -score), i);
  }
  sort(p, p + N);//左から順に昇順ソート
  rep(i, N)cout << p[i].second + 1 << endl;//<入れ子になってる要素>から+1して脱出

ちなみに最後の方のsecond + 1は<入れ子になったpair要素>から抜け出して第三の要素を指定するっぽいね。sortも<入れ子になったpair要素>にしか適応されてない感じ。これ左から無条件に2つまでをソートしてるのかな。

提出

参考

【C++】pairのsecondを基準にソート(abc103_d)
https://perogram.hateblo.jp/entry/2018/12/17/045943
C++(ソートの補足)
https://dai1741.github.io/maximum-algo-2012/docs/cpp-sort/

141-B

解説PDF
解説がCオンリーだったので、C++使った他の方の回答を参考にさせてもらいました。その中でもstring.at()
が使えそうでしたね。

std :: string :: atは、指定された文字列から文字ごとに文字を抽出するために使用できます。

str.at(何番目)で簡単にその文字列を一文字抜き出すことができる。便利ぃ。ちなみに0から数えて何番目かってのを忘れないこと。

B.cpp
  string S;
  bool ans = true;
  cin >> S;
  int size = S.size();
  for(int i = 1; i < size; i += 2){
    if(S.at(i) != 'L' && S.at(i) != 'U' && S.at(i) != 'D')ans = false;
  }
  for(int i = 0; i < size; i += 2){
    if(S.at(i) != 'R' && S.at(i) != 'U' && S.at(i) != 'D')ans = false;
  }

  if(ans)cout << "Yes" << endl;
  else cout << "No" << endl;

あと個人的に気づいたんだけど文字列の判定のときには対象は""じゃなくて''で囲ってるね。え、これstr.at(何番目)使わなくて単にstr(何番目)で良かったんじゃないの…
追伸:やっぱダメでした。一文字のときには" "じゃなくて' 'で囲むみたいですね。

提出

偶数と奇数の判定あべこべにしちゃってたわね…かなり手こずったわ…

参考

string at() in C++
https://www.geeksforgeeks.org/string-at-in-cpp/
提出 #10555501
https://atcoder.jp/contests/abc141/submissions/10555501

152-C

解説PDF
愚直にそれぞれのiの時にi - 1`まで全部調べていったよ。脳死で。制約が

1 \leq N \leq 2 × 10^5

の時点で「これTLE」おこすんじゃね…?とか思ってたら案の定怒られた…
解説PDF見てみると

i = 1, ..., N に対して、Mi
:= min{Pj |1 ≤ j ≤ i} と定義します。すると、i(1 ≤ i ≤ N) を固定し
て考えたときに、 Mi = Pi であることと、 任意の j(1 ≤ j ≤ i) に対して Pi ≤ Pj であることが同
値となります。したがって、 Mi をすべて計算することができれば十分です。これは、 i が小さいほ
うから順に計算していけばよく、 O(N) でこの問題を解くことができました。

ああ…C++には最小値を返してくれる関数があるのか…こういうのって重要ですよね…
慣れてる方だったら「minで一発では()」って思いつくけど、僕はそういう関数あるかもって発想にまず行かなかったですね…情けない

というわけで、他の方の回答を参考にして、最初に相当大きい数をPの最初の値と比較して問答無用で最小値にした後、Pを入力する毎に最小値を更新していく方法をとりました。正直本番でこれ思いつけるとはまだ思えないです…アルゴリズム以前の問題じゃねえか…
配列さえ使わないのか…凄い。

C.cpp
  int N, P, ans = 0;
  cin >> N;
  int mini = 1e9;//1e9 == 10 ^ 9

  rep(i, N){
    cin >> P;
      if(mini >= P)ans++;
    mini = min(mini, P);
  }

  cout << ans << endl;

ここまで解いてきて、個人的にN個の要素を参照する時は脳死で配列に片っ端からぶち込むのではなく、一回ずつ入力してその都度判定するのもいいよって感覚が身についてきたとちょっと感じます。

提出

参考

提出 #10724527
https://atcoder.jp/contests/abc152/submissions/10724527

151-A

解説PDF
方法として24文字全部やるしかなかったんですが、怒られが発生してきちんと文字コードで解くことにしました

A.cpp
char s;
cin >> s;
cout << char(s + 1) << endl;

解説PDF見てみても、まあなんとなくやってることは分かるが…という感じ。要復習です。あと型変換のことキャストっていうんですね、初めて知りました(初心者ムーブ)。

提出

参考

ABC 151 解説
https://img.atcoder.jp/abc151/editorial.pdf

149-C

解説PDF
この問題は単純に素数判定の方法を知らなかったがゆえに解けませんでしたね…知らないとちょっときついやつ(実際、自前でfor文も組めたのですが、奇数だけで割るfor文で最後のiへの操作をi + 2とかにしてたせいで出力が0になってしまってました。書くならi += 2)。最終的に説明付きのスニペットを登録しました。その際、こちらの記事を参考にさせて頂きました。(りゅうせいさんの記事ホント参考になる…)

C.cpp
bool isPrime(int x){
  if(x <= 1) return 0;
  else if(x == 2) return 1;
  if(x % 2 == 0) return 0;
  //Nが素数の時,1とN以外の約数がないので,判定したいときは約数の有無を確かめる.
  //ある約数iがあったとき,N/iもNの約数となる.
  //ここで,i=N/iとなるiは√Nなので,iの候補は1~√Nとなる.
  for(int i = 3; i * i <= x; i += 2) if(x % i == 0) return 0;
  return 1;
}

signed main(){
  int A;
  cin >> A;

  while (!isPrime(A)) {
    A++;
  }

  cout << A << endl;
}

ここまで解いてきて思うんですが、割と本質的でない部分でのミスがほとんどなんですよね、僕の回答。こればっかりはもう気をつけるしかないと思います。

提出

参考

【競プロ】AtCoder早解きテクニック10選 (灰 ~ 緑コーダー向け)
https://qiita.com/xryuseix/items/7e9b4c6f12d001a0c0db

136-B

この類の問題結構見るんですけど未だに定着していない感じだったので投稿。始めにint型として入力された値を文字列に変換するって算段。

B.cpp
signed main(){
  int N;
  cin >> N;
  int ans = 0;

  for(int i = 1; i <= N; i++){
    //string i;
    string stringi = to_string(i);//int型の整数iを文字列stringiとして変換
    if(stringi.length() % 2 == 1)ans++;
  }

to_string(int型整数)で文字列にするとこができました。ここから、整数の桁数を参照することにしました。ググったら1分かそこらで出てくる知識ですが、いちいちググってると早解きに影響するので覚える(素振り)。

提出

参考

整数を文字列に変換する | Programming Place Plus C++編 逆引き
https://programming-place.net/ppp/contents/cpp/rev_res/string001.html

7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?