PythonでABC131
こんにちは、まっちです。
今回は、PythonでABC131のA〜D問題まで解きました。
A - Security
4桁の数字の中に、連続した同じ数字を含むかを判定する。
隣り合う桁を順に比較し、同じ数字だったら処理を抜けます。
S = str(input()) ans = 'Good' for i in range(3): if S[i] == S[i+1]: ans = 'Bad' break print(ans)
B - Bite Eating
N個の数字の中で、総和の差分が最小となるように要素を1つ除外する。
絶対値が最小の要素を除外すれば良いです。
単調増加の要素という点に注目し、以下のように条件分岐をさせます。
- Lが正値 → 先頭の要素を除外
- Lが負値、かつNがLの絶対値以下 → 末尾の要素を除外
- Lが負値、かつNがLの絶対値より大きい → 除外なし(0が除外対象)
N, L = map(int, input().split()) ans = 0 if L >= 0: A = range(2,N+1) elif L <= 0 and N <= abs(L): A = range(1,N) else: A = range(1,N+1) for i in A: ans += L + i - 1 print(ans)
C - Anti-Division
A以上B以下の数字のうち、CでもDでも割り切れない数字の個数を求める。
下記のようにベン図を用いた集合計算が思い浮かべました。
- (A以上B以下の個数) - (Cで割り切れる個数) - (Dで割り切れる個数) + (CでもDでも割り切れる個数)
% 最小公約数 def gcd(a, b): while b: a, b = b, a % b return a % 最大公約数 def lcm(a, b): return a * b // gcd (a, b) A, B, C, D = map(int, input().split()) N = B - A + 1 E = B//C - (A-1)//C F = B//D - (A-1)//D G = B//(lcm(D,C)) - (A-1)//(lcm(D,C)) ans = N - (E + F - G) print(ans)
CとDの最小公倍数を求めるにあたり、下記を参考にしました。
cocodrips.hateblo.jp
D - Megalomania
N個のタスクについて、各時限内で完了するような実行順序を求める。
回答の方針は、以下としました。
- 時限Bが短いものから順に実行する。(可能な実行順序を1つ見つければ良い。)
- 上記の順で工数Aを積み上げていき、時限を超えたら処理を抜ける。
N = int(input()) A = [0]*N B = [0]*N for i in range(N): A[i], B[i] = map(int, input().split()) S = 0 ans = 'Yes' L = sorted(range(N), key=lambda k: B[k]) for j in L: S += A[j] if S > B[j]: ans = 'No' break print(ans)
sortのindexを返す方法については、下記を参考にしました。
codeday.me
以上となります。
間違い等あれば、ご指摘いただけると嬉しいです。
それでは。