初心者のプログラミング日記

プログラミング初心者の日記

プログラミングに関することを書いていきます。

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を使って締め切りが近い順に処理していけばいい