AtCoder Beginner Contest 261の解説記事です。
ABC261 A – Intersection
問題
問題文の要約は以下の通りです。
問題の要約
数直線があり、\(X = L_1 から X = R_1\) までをすべて赤色で塗り、\(X = L_2 から X = R_2\) までをすべて青色で塗ります。赤色と青色の両方で塗られている部分の長さを求よ。
解説1
for
文を用いて、赤色と青色の両方で塗られている数直線上の整数の個数をカウントする。
解説
入力を受け取ります。
# 入力
L1,R1,L2,R2=map(int,input().split())
重なっている区間上の整数の個数を \(ans\) とします。数直線上の整数 \(0\) から \(100\) までを調べ、整数 \(i\) が赤色の \(L_1 から R_1\) までの区間と青色の\(L_2 から R_2\) までの区間の両方に含まれている場合、\(ans\) に \(+1\) を行います。
# 重なっている区間上の整数の個数
ans=0
# 数直線上の整数0から100までを調べる
for i in range(101):
# 整数 i が赤色の区間 [L1, R1] と青のの色区間 [L2, R2] の両方に含まれている場合
if L1<=i<=R1 and L2<=i<=R2:
ans+=1
共通部分がない、すなわち、\(ans=0\) の場合は、区間の長さは \(0\) となるので、\(0\) を出力します。重なっている整数の個数が \(ans\) 個なら、数直線上の区間の長さは \(ans – 1\) なので、\(ans – 1\) を出力します。
# 共通部分がない場合は、区間の長さは0
if ans==0:
print(0)
else:
# 重なっている整数の個数が ans 個なら、数直線上の区間の長さは (ans - 1)
print(ans-1)
解答
# 入力
L1,R1,L2,R2=map(int,input().split())
# 重なっている区間上の整数の個数
ans=0
# 数直線上の整数0から100までを調べる
for i in range(101):
# 整数 i が赤色の区間 [L1, R1] と青のの色区間 [L2, R2] の両方に含まれている場合
if L1<=i<=R1 and L2<=i<=R2:
ans+=1
# 共通部分がない場合は、区間の長さは0
if ans==0:
print(0)
else:
# 重なっている整数の個数が ans 個なら、数直線上の区間の長さは (ans - 1)
print(ans-1)
解説2
set
を用いて、赤色と青色の両方で塗られている数直線上の整数の共通集合を求める。
解説
入力を受け取ります。
# 入力
L1,R1,L2,R2=map(int,input().split())
赤色の \(L_1 から R_1\) までの区間に含まれる整数のset
と青色の\(L_2 から R_2\) までの区間に含まれる整数のset
を求め、それらの共通部分(積集合)の個数を求めます。共通部分(積集合)は&
で、個数はlen
で求めることができます。
# 赤色で塗られた区間[L, R]に含まれる整数のset
set1=set(i for i in range(L1,R1+1))
# 青色で塗られた区間[l, r]に含まれる整数のset
set2=set(i for i in range(L2,R2+1))
# 赤色と青色の両方で塗られている、set1とset2の共通部分(積集合)の個数
ans=len(set1&set2)
共通部分がない、すなわち、\(ans=0\) の場合は、区間の長さは \(0\) となるので、\(0\) を出力します。重なっている整数の個数が \(ans\) 個なら、数直線上の区間の長さは \(ans – 1\) なので、\(ans – 1\) を出力します。
# # 共通部分がない場合は、区間の長さは0
if ans==0:
print(0)
# 重なっている整数の個数が ans 個なら、数直線上の区間の長さは (ans - 1)
else:
print(ans-1)
解答
# 入力
L1,R1,L2,R2=map(int,input().split())
# 赤色で塗られた区間[L, R]に含まれる整数のset
set1=set(i for i in range(L1,R1+1))
# 青色で塗られた区間[l, r]に含まれる整数のset
set2=set(i for i in range(L2,R2+1))
# 赤色と青色の両方で塗られている、set1とset2の共通部分(積集合)の個数
ans=len(set1&set2)
# # 共通部分がない場合は、区間の長さは0
if ans==0:
print(0)
# 重なっている整数の個数が ans 個なら、数直線上の区間の長さは (ans - 1)
else:
print(ans-1)