AtCoder Beginner Contest 100

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

A - Happy Birthday!

C++

#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int a,b;
    scanf("%d %d",&a,&b);
    printf("%s\n",(a<9 && b<9)?"Yay!":":(");
 
    return 0;
}

多分どちらかが8より大きいと連続する2切れを取ってしまうと思う。なのでそれを判定条件にすれば大丈夫だと思う。

B - Ringo's Favorite Numbers

C++

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

int main(){
    int d,n;
    scanf("%d %d",&d,&n);
    if (n==100) n++;
    if (d==0) {
        printf("%d\n",n);
    } else if (d==1) {
        printf("%d\n",n*100);
    } else {
        printf("%d\n",n*10000);
    }
    return 0;
}

入出力例の通りに1,2,3...とかで適当に数える。但しn=100の時だけ少し例外になる。

C - *3 or /2

C++14

#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int n,ans=0,tmp=0;
    scanf("%d",&n);
    vector<long long> a(n);
    for (auto&e:a) scanf("%d",&e);
    for (int i=0;i<n;i++) {
        tmp=0;
        long long k=a[i];
        for(;;) {
            if (k>=1 && k%2==0) {
                k/=2;
                tmp++;
            } else {
                break;
            }
        }
        ans+=tmp;
    }
    printf("%d\n",ans);
    return 0;
}

先に解説を見てしまったけどもその前に小さいケースで色々確認して自分で気づくべきだった。。掛ける3は何がどうなっても割る2が出来なかったものが出来るようにはならないので、数列全体で割る2が出来るものを1つだけするのを繰り返すことになる。掛ける3はシミュする意味はないのでひたすら割る2が出来る回数だけ調べてその和が解になる。

D - Patisserie ABC

Python3

n,m=map(int,input().split())
l000=[]
l001=[]
l010=[]
l100=[]
for i in range(n):
    x,y,z=map(int,input().split())
    l000.append((x+y+z,x,y,z))
    l001.append((x+y-z,x,y,z))
    l010.append((x-y+z,x,y,z))
    l100.append((-x+y+z,x,y,z))
l000.sort()
l001.sort()
l010.sort()
l100.sort()
dx=[0]*8
dy=[0]*8
dz=[0]*8
for i in range(m):
    dx[0]+=l000[i][1]
    dy[0]+=l000[i][2]
    dz[0]+=l000[i][3]
    dx[1]+=l000[-i-1][1]
    dy[1]+=l000[-i-1][2]
    dz[1]+=l000[-i-1][3]
    dx[2]+=l001[i][1]
    dy[2]+=l001[i][2]
    dz[2]+=l001[i][3]
    dx[3]+=l001[-i-1][1]
    dy[3]+=l001[-i-1][2]
    dz[3]+=l001[-i-1][3]
    dx[4]+=l010[i][1]
    dy[4]+=l010[i][2]
    dz[4]+=l010[i][3]
    dx[5]+=l010[-i-1][1]
    dy[5]+=l010[-i-1][2]
    dz[5]+=l010[-i-1][3]
    dx[6]+=l100[i][1]
    dy[6]+=l100[i][2]
    dz[6]+=l100[i][3]
    dx[7]+=l100[-i-1][1]
    dy[7]+=l100[-i-1][2]
    dz[7]+=l100[-i-1][3]
ans=abs(dx[-1])+abs(dy[-1])+abs(dz[-1])
for i in range(7):
    ans=max(ans,abs(dx[i])+abs(dy[i])+abs(dz[i]))
print(ans)

x,y,zのそれぞれを正|負でなんとなく最大の値になるようにな8通りを試しました。なぜかACになりました。解説を読みましょう。