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
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文字以上の長さで過半数が〜というのが絶対に作れないです。