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になるはずです。