ABC131(A~D)
A - Security
https://atcoder.jp/contests/abc131/tasks/abc131_a
かかった時間 2分
実行時間 26ms
S=str(input()) for i in range(len(S)-1): if S[i]==S[i+1]: print("Bad") exit() print("Good")
B - Bite Eating
https://atcoder.jp/contests/abc131/tasks/abc131_b
かかった時間 10分
実行時間 119ms
import numpy as np N,L=map(int,input().split()) A=[] for i in range(1,N+1): num=L+i-1 A.append(num) B=[] for i in range(len(A)): s=sum(A)-A[i] B.append(s) index=np.abs(np.asarray(B)-sum(A)).argmin() print(B[index])
C - Anti-Division
https://atcoder.jp/contests/abc131/tasks/abc131_c
かかった時間 50分
実行時間 23ms
import math A,B,C,D=map(int,input().split()) num=B-A+1 def lcm(x, y): return (x * y) // math.gcd(x, y) k=lcm(C,D) y1=B//D y2=(A-1)//D sum1=y1-y2 x1=B//C x2=(A-1)//C sum2=x1-x2 z1=B//k z2=(A-1)//k sum3=z1-z2 sums=(sum1+sum2)-sum3 print(num-sums)
公倍数の所を(C+D)としていて、気づくまでに時間がかかってしましました。
考え方としては、まずBの範囲にあるCとD、CとDの最小公倍数の約数の個数を求めます。(y1,x1,z1)
同じく、A未満にある約数の個数も求める。(y2,x2,z2)
それらの、(y1-y2)とするとA~Bの範囲内にあるC,Dの約数の個数が求められる。
それから、CとDの最小公倍数の約数の個数を引けば重複している値を除いたA~Bの範囲内にあるC,Dの約数の個数がわかる。
あとは、A~Bの範囲内にある整数の個数と上記で求めたC,Dの約数の個数を引けば答えになる。
D - Megalomania
https://atcoder.jp/contests/abc131/tasks/abc131_d
かかった時間 10分
実行時間 930ms
from heapq import heappop,heapify N=int(input()) g=[] time=0 for i in range(N): A,B=map(int,input().split()) g.append([B,A]) heapify(g) while g: b,a=heappop(g) time+=a if time>b: print("No") exit() print("Yes")
heapqを使って締め切りが近い順に処理していけばいい