AtCoder Beginner Contest 063/AtCoder Regular Contest 075
はい。
https://atcoder.jp/contests/abc063
A - Restricted
Python3
a,b=map(int,input().split()) print(a+b if a+b<10 else 'error')
A+Bの足し算で。
B - Varied
Python3
s=input() chk=len(s) ans=set([i for i in s]) print('yes' if len(ans)==chk else 'no')
set型にして要素数が変わるか。setがなくても先頭から出現回数数えても十分間に合うはず。
C - Bugged
C++14
#include<bits/stdc++.h> using namespace std; int main(){ int n,s,t,tmp=0; scanf("%d",&n); vector<int> a; for (int i=0;i<n;i++) { scanf("%d",&s); if (s%10==0) tmp+=s; else a.push_back(s); } sort(a.begin(),a.end()); t=accumulate(a.begin(),a.end(),0); if (t%10==0 && t>0) t-=a[0]; printf("%d\n",(tmp+t)%10==0?0:tmp+t); return 0; }
10の倍数以外の総和で10の倍数以外の数が作れるか。総和が10の倍数になったら要素中の最小の数を外せば10の倍数ではなくなるのでそれを10の倍数だけ集めたもの(0があり得る)との和でなんとか。
D - Widespread
PyPy3
n,a,b=map(int,input().split()) t=a-b ans=[0]*2 d=[] for i in range(n): h=int(input()) d.append(h) d.sort(reverse=True) ans[1]=max(d) while ans[1]-ans[0]!=1: x=z=(ans[1]+ans[0])//2 y=x*b for i in range(n): p=d[i]-y if p<=0: break x-=(p+t-1)//t if x<0: break if x<0: ans[0]=z else: ans[1]=z print(ans[1])
シミュは無理です。初期ではans[0]が0で絶対に爆発が足りない回数、a[1]が体力最大値で絶対に足りる回数にしてます。2つの数の和を2で割ったものを調べる用の回数とします。調べます。足りてる足りてないによってどちらかの数を更新します。更新された数の和を2で割ったもので調査を繰り返します。2つの数の差が1になるまで繰り返します。
爆発回数が足りているかは爆発ダメージBと回数の積より大きな体力のあるものが爆発ダメージAの攻撃対象として調べます。