AtCoder Beginner Contest 043/AtCoder Regular Contest 059

はい。
https://atcoder.jp/contests/abc043
https://atcoder.jp/contests/arc059

A - キャンディーとN人の子供イージー / Children and Candies (ABC Edit)

C++14

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

int main(){
    int n;
    scanf("%d",&n);
    printf("%d\n",n%2?(1+n)*(n/2)+(n/2+1):(1+n)*(n/2));
    return 0;
}

PyPy3

n=int(input())
print((1+n)*n//2)

n(n+1)/2で済むのを忘れっぽくて忘れるとループ回したりして計算する場合も。。。制約によってはループ回すが大丈夫じゃない場合があるので式を覚える、覚えてなくても式を作れるようにしておきましょうという。

B - バイナリハックイージー / Unhappy Hacking (ABC Edit)

C++14

#include<bits/stdc++.h>
using namespace std;
 
int main(){
    char s[10];
    char ans[11]={'b','b','b','b','b','b','b','b','b','b','b'};
    scanf("%s",s);
    for (int i=0;i<strlen(s);i++) {
        if (s[i]=='0' || s[i]=='1') {
            for (int j=0;j<10;j++){
                if (ans[j]=='b') {
                    ans[j]=s[i];
                    break;
                }
            }
        } else {
            if (ans[0]!='b') {
                for (int j=1;j<10;j++) {
                    if (ans[j]=='b') {
                        ans[j-1]='b';
                        break;
                    }
                }
            }
        }
    }
 
    for (int i=0;i<10;i++) {
        if (ans[i]!='b') {
            printf("%c",ans[i]);
        }
    }
    printf("\n");
 
    return 0;
}

Python3

s=input()
ans=[]
for i in s:
    if len(ans) and i=='B': ans.pop()
    elif i!='B': ans.append(i)
print(''.join(ans))

C++14だと強引に自前で色々力押しした。。でもまぁ deque でpushとかpopするともっと短くシンプルに書けたようです。popするときは空でないことに注意かな、多分、。。 これくらいの制限の文字列処理とかなら別にPython3使えばいいように思います。この長さ程度の文字列処理はPythonでやるほうが学習コストが圧倒的に低い気がします。多分ですけど。

C - いっしょ / Be Together

C++14

#include<bits/stdc++.h>
using namespace std;
 
int main(){
    int n,chk,ans;
    scanf("%d",&n);
    vector<int> a(n);
    for(auto&e:a) scanf("%d",&e);
    for (int i=-100;i<101;i++) {
        chk=0;
        for (int j=0;j<n;j++) {
            chk+=abs(a[j]-i)*abs(a[j]-i);
        }
        if (i==-100) ans=chk;
        ans=min(ans,chk);
    }
    printf("%d\n",ans);
 
    return 0;
}

Python3

n=int(input())
a=[int(i) for i in input().split()]
d=sum(a)
t=[d//n,d//n+1]
ans=[0]*2
for i in a:
    ans[0]+=(i-t[0])**2
    ans[1]+=(i-t[1])**2
print(min(ans))

想定解では-100から100の間でいずれかに揃えると仮定して全部調べても間に合うので全部調べるということらしいです。想定解とは違う方針で均値らへんだけを調べてもなんとかなるようです。証明はありません。

D - アンバランス / Unbalanced

C++14

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

int main(){
    char s[100000];
    scanf("%s",s);
    for (int i=0;i<strlen(s)-2;i++) {
        if (s[i]==s[i+1] || s[i]==s[i+2] || s[i+1]==s[i+2]) {
            printf("%d %d\n",i+1,i+3);
            return 0;
        }
    }
    if (strlen(s)==2 && s[0]==s[1]) printf("1 2\n");
    else printf("-1 -1\n");
    return 0;
}

PyPy3

s=input()
if len(s)==2:
    print(["-1 -1","1 2"][s[0]==s[1]])
    exit()
x=len(s)
for i in range(x-2):
    chk=[s[i],s[i+1],s[i+2]]
    chk.sort()
    if chk[0]==chk[1] or chk[1]==chk[2]:
        print(i+1,i+3)
        exit()
print("-1 -1")

1,2か1,3文字目、書き方によって2,3文字目をが同じである箇所を探す。それよりも長い部分を見ても必ずその中に3文字中2文字が同じという部分があるので長い部分を見る必要はなし。3文字中で2文字以上同じとかの部分がないと4文字以上の長さで過半数が〜というのが絶対に作れないです。