見出し画像

ABC252感想・反省など

適当に感想と反省を記すメモみたいなものです
A~Cの3完でした

A問題

やり方さえ知っていればやるだけの問題

#include<bits/stdc++.h>
using namespace std;
int main(){
  int N;
  cin>>N;
  cout<<char(N)<<endl;
}
print(chr(int(input())))

B問題

最大値のindexがBに含まれていたらYesなのでそれを全探索する

#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<(n);i++)
#define ALL(x) x.begin(),x.end()
using namespace std;
int main() {
  int N, K;
  cin >> N >> K;
  vector<int> A(N);
  unordered_set<int> B;
  rep(i, N) cin >> A[i];
  rep(i, K) {
    int b;
    cin >> b;
    B.insert(b);
  }
  ll m = *max_element(ALL(A));//最大値を取得
  rep(i, N) {
    if (A[i] == m && B.count(i + 1)) cout<<"Yes"<<endl;
    //最大値でかつBに含まれているならYes
    //0-indexedなのに注意
  }
  cout<<"No"<<endl;
}
N,K=map(int,input().split())
A=list(map(int,input().split()))
B=set(map(int,input().split()))
mx=max(A)
flag=False
for i in range(N):
  if A[i]==mx and i+1 in B:
    flag=True
print("Yes" if flag else "No")

C問題

ちょっと問題がわかりづらくて時間かかった+1WAした。
揃える数でループ+全部揃うまでループ+リールの数でループ
をればいい。

#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<(n);i++)
using namespace std;
int main() {
  int N;
  cin >> N;
  vector<string> S(N);
  rep(i, N) cin >> S[i];
  int ans = 100000000;//適当に大きい数で初期化
  rep(i, 10) {  //揃える数
    vector<bool> b(N);//揃っているかのチェック用
    int cnt = 0;//揃っているリールの数
    rep(t, N * 10) {
      //全部揃うまでループする
      //遅くともN*10秒後にはすべてそろう(やらなくてもいい)
      rep(k, N) if (!b[k]) {//すべてのリールについて
        if (S[k][t % 10] == i + '0') {
          b[k] = 1;
          cnt++;
          break;//揃ったら抜ける(抜けないと同じ秒数で2回押すところが出る)
        }
      }
      if (cnt == N) {//全部埋まったとき
        if(ans>t)ans=t;
        break;
      }
    }
  }
  cout<<ans<<endl;
}
N=int(input())
S=[input() for _ in range(N)]
ans=10000000
for i in range(10):#揃える数
  b=[0]*N
  for t in range(N*10):#時間(揃うまでのループ)
    for k in range(N):#Sの各要素
      if not b[k] and int(S[k][t%10])==i:
        b[k]=1
        break
    if not 0 in b:
      ans=min(ans,t)
print(ans)

D問題の反省会

D問題解けませんでした…
以下考えたことです。
i<j<kで各要素を見るとき、(i,j,k)の組はnC3個存在する
これはソートしても変わらないからソートする。
A_i=A_j or A_j=A_k or A_k=A_iであるときの個数をnC3から引く
つまり、重複して2個or3個選べばそれは除かれる
前から個数を見て2個以上なら(N-個数)×個数C2
加えて、3個以上なら個数C3を足す
これを実装すればよかった。
実装にミスがありました…
(↓一部抜粋)

誤) rans+=nCr<ll>(it - itr-2, 2);
正) rans+=nCr<ll>(it - itr, 3);

提出コード

まとめ


みんなにこれだけ言いたい。
落ち着いて解こうね☆

この記事が気に入ったらサポートをしてみませんか?