AtCoder Beginner Contest 042/AtCoder Regular Contest 058
はい。
https://atcoder.jp/contests/abc042
https://atcoder.jp/contests/arc058
A - 和風いろはちゃんイージー / Iroha and Haiku (ABC Edition)
C++14
#include<bits/stdc++.h> using namespace std; int main(){ int a,b,c; scanf("%d %d %d",&a,&b,&c); printf("%s\n",(a==5 || a==7) && (b==5 || b==7) && (c==5 || c==7) && (a+b+c==17)?"YES":"NO"); return 0; }
Python3
a=[int(i) for i in input().split()] a.sort() print("YES" if a[0]==a[1]==5 and a[2]==7 else "NO")
a,b,cをソートして先頭から5,5,7を見たほうが判定時の書き方はシンプルじゃないかな、と思います。今回はソートしないでa,b,cいずれも5or7で合計17とか力技な判定させましたけど。。
B - 文字列大好きいろはちゃんイージー / Iroha Loves Strings (ABC Edition)
C++14
#include<bits/stdc++.h> using namespace std; int main(){ int n,l; cin >>n >>l; vector<string> s(n); for (auto&e:s) cin >>e; sort(s.begin(),s.end()); for (int i=0;i<n;i++) cout <<s[i]; cout <<endl; return 0; }
Python3
n,l=map(int,input().split()) d=[input() for i in range(n)] d.sort() ans="" for i in d: ans+=i print(ans)
C++のstringはよくわかりません。これくらいの問題だったらPythonで書くほうがいい気がします。
C - こだわり者いろはちゃん / Iroha's Obsession
C++14
#include<bits/stdc++.h> using namespace std; int main(){ int n,k,f=0,tmp,chk; bool b[10]={0}; scanf("%d %d",&n,&k); vector<int> d(k); for(auto&e:d) scanf("%d",&e); for (int i=0;i<k;i++) b[d[i]]=1; for (int i=n;i<100000;i++) { f=0; tmp=i; while (tmp>0) { chk=tmp%10; tmp/=10; if (b[chk]==1) { f=1; break; } } if (f==0 && i>=n) { printf("%d\n",i); break; } } return 0; }
Python3
n,k=map(int,input().split()) d=[int(i) for i in input().split()] t=n while 1: x=t while 1: if x%10 in d: break else: x//=10 if x==0: print(t) exit() t+=1
+1しながら使えない数を使っていないか確認する。
D - いろはちゃんとマス目 / Iroha and a Grid
C++14
#include<bits/stdc++.h> using namespace std; const int MAX=510000; const int MOD=1000000007; long long fac[MAX], finv[MAX], inv[MAX]; void COMinit() { fac[0]=fac[1]=1; finv[0]=finv[1]=1; inv[1]=1; for (int i=2;i<MAX;i++) { fac[i]=fac[i-1]*i%MOD; inv[i]=MOD-inv[MOD%i]*(MOD/i)%MOD; finv[i]=finv[i-1]*inv[i]%MOD; } } long long COM(int n,int k) { if (n<k) return 0; if (n<0 || k<0) return 0; return fac[n]*(finv[k]*finv[n-k]%MOD)%MOD; } int main(){ COMinit(); int h,w,a,b,ans=0,ex=0,t; scanf("%d %d %d %d",&h,&w,&a,&b); t=h-a; for (int i=0;i<(w-b);i++) { ans+=(COM(t+b-1+i,t-1)*COM(a+(w-b)-2-i,a-1))%MOD; ans%=MOD; } printf("%d\n",ans); return 0; }
サンプル2で図を起こしてみると、スタートOからゴールZまで移動するにはp -> P, q -> Q, r -> R いずれかの経路を通る必要がある。なのでO -> pまでの組合せとP -> Zまで組合せの積を求めてq, rも同様に計算してその総和が解になります。多分。解説にもそう書いてあります。多分。