diverta 2019 Programming Contest
はい。
https://atcoder.jp/contests/diverta2019
ooo--- unratedでした。
A - Consecutive Integers
Python3
n,k=map(int,input().split()) print(n-k+1)
1,2,3・・・Nの連続した整数の中から連続した整数をK個選ぶには開始位置からNまでの間に必ずK個の整数が必要になる。なので1から始まってN-K+1番目までが選べるはず。
B - Resale
C++17
#include<bits/stdc++.h> using namespace std; int main(){ int r,g,b,n,ans=0; scanf("%d %d %d %d",&r,&g,&b,&n); for (int i=0;i<n+1;i++) { for (int j=0;j<n+1;j++) { if ((i*r+j*g)>n) break; if ((n-(i*r+j*g))%b==0) ans+=1; } } printf("%d\n",ans); return 0; }
PyPy3
r,g,b,n=map(int,input().split()) ans=chk=0 for i in range(n+1): for j in range(n+1): if (i*r+j*g)>n: break if (n-(i*r+j*g))%b==0: ans+=1 print(ans)
Python3
def sol(): r,g,b,n=map(int,input().split()) ans=chk=0 for i in range(n+1): for j in range(n+1): if (i*r+j*g)>n: break if (n-(i*r+j*g))%b==0: ans+=1 print(ans) if __name__ == '__main__': sol()
コンテスト中は始めはPython3で提出してTLEが1件発生。少し考えたけど明らかに無限ループではないはず、処理を軽くする方法が思いついく気がしない、TLEは全テストケースの中で1件だけ。これC++で行けるでしょ、多分??ってことで書き直してACしました。PyPy3はコンテスト後にPython3では通らなくても同じコードでPyPy3なら通る説を聞いて提出してみたら確かに同じコードでAC。あとこの記事書いている最中に if __name__ == '__main__':
でちょっと早くなるよ説を思い出したので試してみたらAC。色々難しいですね。。。
C - AB Substrings
Python3
n=int(input()) ans=0 d={"a":0,"b":0,"w":0} for i in range(n): s=input() if s[0]=="B" and s[-1]=="A": d["w"]+=1 elif s[0]=="B" : d["b"]+=1 elif s[-1]=="A" : d["a"]+=1 ans+=s.count("AB") if d["a"]==0 and d["w"]>0: d["a"]=1 d["w"]-=1 if d["w"]>0: ans+=d["w"] d["w"]=0 d["a"]-=1 if d["b"]>0: ans+=1 d["b"]-=1 ans+=max(0,min(d["a"],d["b"])) print(ans)
とりあえず文字列中のABは全部数えておく。連続したABを増やすためには「末尾Aの単語」の次から「先頭Bで末尾Aの単語」をあるだけ連続して最後に「先頭Bの単語」で締め。あとは余ってたら「末尾Aの単語」と「先頭Bの単語」でABを作ってよしなに数えてAC。
D - DivRem Number
Python3
def div(n): divisors = [] for i in range(1, int(n**0.5)+1): if n % i == 0: divisors.append(i) if i != n // i: divisors.append(n//i) return divisors n=int(input()) d=div(n) ans=0 for i in d: x=i-1 if x!=0 and n//x==n%x: ans+=x print(ans)
コンテスト中にはAC出来ませんでした。N-1が1つ必ず商1で余り1って気づいてて、約数-1に気づかないのは結構哀しい事案です。約数列挙して約数-1の時に成立したらカウントしてACになるはずです。