おはやし日記

特にテーマ無しの日記。

AtCoder ABC167【3完】

こんにちは。

↑これは昨日の僕。今日が当日です。

今回はAからCまで、1発ACでした。Dは時間的に無理だったし細かい実装もわからんので諦めた

A

atcoder.jp

提出

AC

#include <bits/stdc++.h>
using namespace std;
int main(){
  string s, t;
  cin>>s>>t;
  int l = s.size();

  for(int i=0; i<l; i++){
    if(s[i]!=t[i]){
      cout<<"No\n";
      return 0;
    }
  }
  cout<<"Yes\n";
  return 0;
}

最初、sとtが1文字違い、というのを判定しようとしていたがそもそも制約で一文字違いだと書いてあった。

最後の1文字はどうでもいいので短い方(s)の文字数だけ、それぞれが一致しているか確認するだけ。

依然文字列の比較を一文字ずつやりがち。Lの最後を削ってif(s==t)にしても良かったと思う。

↑できた。 ACしかも、さっきは実行時間6msだったのが、こっちは2msになった

#include <bits/stdc++.h>
using namespace std;
int main(){
  string s, t;
  cin>>s>>t;

  t.erase(t.end()-1);

  cout<<( s==t ? "Yes\n" : "No\n" );
  return 0;
}

B

atcoder.jp

提出

AC

#include <bits/stdc++.h>
using namespace std;
int main(){
  long long A, B, C, K;
  cin>>A>>B>>C>>K;
  if(K<=A){
    cout<<K<<endl;
    return 0;
  }else if(K<=A+B){
    cout<<A<<endl;
    return 0;
  }else{
    cout<< (A- (K-A-B) )<<endl;
    return 0;
  }
}

1のカードから取っていくのが最適なので、K枚でどこまで拾えるかを場合分けにした。

C

atcoder.jp

提出

AC

Submission #13070119 - AtCoder Beginner Contest 167

日中に、bit全探索なる手法を見ていたので、bit全探索の神の声が聴こえた。

C - HonestOrUnkind2

この問題がわからんくて、解説を探したりしていたら「bit全探索」と書いてあった。

今回も、N,Mが12以下なので、各参考書の買う/買わないをbitにして探索しても間に合うと思い、なんとか実装。

最初、Xを読み込むのを忘れていてなかなかテストがうまくいかなくて悩んだw

個人的に良かったところ

  • int CA[15][15] = {};
    CとAを分けて読み込んでいたが、こんがらがるし意味がないのでまとめたらスッキリした

  • lastans = *min_element(ans.begin(), ans.end());
    理解度の分岐を通過した(理解度を全てX以上にできる買い方の)金額で最小のものを選びたかったわけだが、ans = min(ans, CA_sum[0])としていたら最初にansを超大きい値にしておかないといけないのでは?と思ったので、とりあえず全部候補に突っ込んで後で最小のものを選ぶことにした。
    min関数にvector<int>ansを突っ込もうとしたが、なんかダメっぽいので検索したらmin_element関数に出会った。
    これは、配列の渡した範囲で最小の要素のイテレータを返すので、*をつけて答えを引っ張り出した。

振り返り

今回はCまで解けて良かった。えらい!

おしまい。

プライバシーポリシー ・お問い合わせはこちら