AtCoder Beginner Contest 045/AtCoder Regular Contest 061

はい。
https://atcoder.jp/contests/abc045

A - 台形 / Trapezoids

C++14

#include<bits/stdc++.h>
using namespace std;

int main(){
    int a,b,h;
    scanf("%d",&a);
    scanf("%d",&b);
    scanf("%d",&h);
    printf("%d\n",(a+b)*h/2);
 
    return 0;
}

(上底+下底)×高さ÷2で。

B - 美しい文字列 / Beautiful Strings

C++14

#include<bits/stdc++.h>
using namespace std;
 
int main(){
    char s1[101],s2[100],s3[100];
    deque<char> a;
    deque<char> b;
    deque<char> c;
    scanf("%s",s1);
    for (int i=0;i<strlen(s1);i++) a.push_back(s1[i]);
    scanf("%s",s2);
    for (int i=0;i<strlen(s2);i++) b.push_back(s2[i]);
    scanf("%s",s3);
    for (int i=0;i<strlen(s3);i++) c.push_back(s3[i]);
    int f=0;
    for(;;) {
        if (f==0) {
            if (a.empty()) {
                printf("A\n");
                break;
            }
            f=a.front()-'a';
            a.pop_front();
        } else if (f==1) {
            if (b.empty()) {
                printf("B\n");
                break;
            }
            f=b.front()-'a';
            b.pop_front();
        } else {
            if (c.empty()) {
                printf("C\n");
                break;
            }
            f=c.front()-'a';
            c.pop_front();
        }
    }
    return 0;
}

実際にシミュするしかないと思う。deque使ってみたくて試してみた。もっとシンプルに書けると思う。charが[101],[100]とかしてる理由は多分寝ぼけてたから。

C - たくさんの数式 / Many Formulas

Python3

s=input()
 
ans=tmp=0
t=len(s)
 
for i in range(1<<(t-1)):
    tmp=int(s[0])
    for j in range(t-1):
        if (i & (1<<j)):
            tmp*=10
            tmp+=int(s[j+1])
        else:
            ans+=tmp
            tmp=int(s[j+1])
    ans+=tmp
print(ans)

C++14

#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int n,m;
    char s[10];
    long long tmp=0,ans=0;
    scanf("%s",s);
    for (int i=0;i<(1<<(strlen(s)-1));i++) {
        tmp=(s[0]-'0');
        for (int j=0;j<(strlen(s)-1);j++) {
            if (i & (1<<j)) {
                tmp*=10;
                tmp+=(s[j+1]-'0');
            } else {
                ans+=tmp;
                tmp=(s[j+1]-'0');
            }
        }
        ans+=tmp;
    }
    printf("%lld\n",ans);
    return 0;
}

各文字間で+が入るか、入らず2桁以上の数として使うのかを全部試してその和を求めた。

D - すぬけ君の塗り絵 / Snuke's Coloring

PyPy3

def sol():
    import sys
    input=sys.stdin.readline
    h,w,n=map(int,input().split())
    d={}
    t=[(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2)]
    for i in range(n):
        y,x=map(int,input().split())
        for a,b in t:
            a+=y
            b+=x
            if 0<a<=h and 0<b<=w and (a,b) in d: d[(a,b)]+=1
            elif 0<a<=h and 0<b<=w: d[(a,b)]=1
 
    ans=[0]*10
    for i in d:
        if i[0]>2 and i[1]>2:
            ans[d[i]]+=1
 
    ans[0]=h*w-sum(ans)-w*2-h*2+4
    for i in ans:
        print(i)
 
if __name__=="__main__":
    sol()

当初はシミュしていたら配列が大きすぎてエラーになってました。入力で与えられる座標を受け取りながら影響する範囲にそれぞれ+1しておく。3行3列のドコかの座標を全部調べる。
影響する範囲〜とドコかの座標の取り方は一致させないと計算がズレる気がします。ウチの提出コードでは右下の座標で取るようにしてます。なので一番左上の3x3の黒いマスの個数は座標(3,3)で見るようにしてます。座標(2,2)のように中心で取るようにした場合は影響する範囲が+-1の八方にという感じになると思います、多分。。