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);
まとめ
みんなにこれだけ言いたい。
落ち着いて解こうね☆