まっちは静かに暮らしたい

日々のアウトプットや技術系の備忘として。

PythonでABC131

こんにちは、まっちです。

今回は、PythonでABC131のA〜D問題まで解きました。


atcoder.jp

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
 


以上となります。
間違い等あれば、ご指摘いただけると嬉しいです。

それでは。