Mercari2024
A
https://mofecoder.com/contests/mercon2024/tasks/mercon2024_a
#愚直
n,p = Integer().contentos, so = [], []for i in range(n): c,s = String().content c = int(c) if s== "on_sale": os.append(c) else: so.append(c)YesNo(max(so)<p and p<min(os))
解法
on_sale と sold_out でそれぞれを分けて か否かで出力を分ける。
B
https://mofecoder.com/contests/mercon2024/tasks/mercon2024_b
#貪欲法
n = Integer().contentd,c = defaultdict(int), defaultdict(int)for i in range(n): u,v,h = Integer().content d[v] = u if h>c[v] else d[v] c[v] = max(c[v], h)print(len(d))for i in sorted(d.items()): print(*i)
解法
1対1の関係が成立しているので、幸せ値が大きくなるように貪欲で可能。 現場では貪欲に気付くまでとても時間がかかった。
C
https://mofecoder.com/contests/mercon2024/tasks/mercon2024_c
#数学
w,h,t = Integer().contentx,y = Integer().contentW,H = (x+t)//w, (y+t)//hprint( (x+t)%w if W%2==0 else w-(x+t)%w, (y+t)%h if H%2==0 else h-(y+t)%h )
解法
個人的にはこっちより の方が難しかった。 とりあえず壁を考えずに進めきったのちに、 を でそれぞれの商と余を求める。商が偶数のとき、それぞれは正の方向に進んでおり、奇数のときは負の方向に進んでいるので、負の時は反射で帰ってきていることに気を付けながら出力する。 なんとなく気体の分子運動を思いうかべた。
D
https://mofecoder.com/contests/mercon2024/tasks/mercon2024_d
#区間スケジューリング
# 値の代入n,m = Integer().contenttimes = [Integer().content for _ in range(n)]wanna = [Integer().content for _ in range(m)]
ans = 0query = []
# 0 -> 展示期間フラグ, 1 -> 希望購入時間フラグfor x,y in times: query.append((x, 0, y))for z in wanna: query.append((z, 1, z))
query.sort()shoes = SortedList()
for a,b,c in query: # フラグが "0" のとき、展示終了時間をqueue if b==0: shoes.add(c)
else: # フラグが "1" のとき、すでに展示終了しているものをdequeue while shoes and shoes[0]<(z:=a): shoes.pop(0)
# 展示中の靴があるならば、購入(dequeue)して、ans++ if shoes: shoes.pop(0) ans += 1
print(ans)
解法
おそらく区間スケジューリング、の発展形と思われる。 コメントアウトで言いたいことは書いてしまった気がする。
E