題解|ZeroJudge c004. 10812 - Beat the Spread!

【題目】c004. 10812 - Beat the Spread!

題解

c004.py
1
2
3
4
5
6
7
8
9
n=int(input())
for i in range(n):
a,b=map(int,input().split())
if a<b or ((a+b)%2!=0 or (a-b)%2!=0):
print("impossible")
else:
y=(a-b)//2
x=(a+b)//2
print(max(x,y),min(x,y))

解說

程式第3行的

3
a,b=map(int,input().split())

這段的意義在於把輸入的測資(例如【範例輸入#1】中的40 20)先用split()分開,再分別轉換成int型態,然後分別指派給a跟b。
之後,可以注意到,第4行的程式

4
if a<b or ((a+b)%2!=0 or (a-b)%2!=0)

是用來判斷

  1. a跟b的大小關係,因為輸入說明有提到輸入的數字s及d分別是分數的總和及差的絕對值,因此當a<b就是不可能發生的case。
  2. a+b跟a-b是否可以被2整除,因為稍後我們會用到聯立方程式,倘若不能被2整除,代表分數是非整數,是不合法的case。

接著,在else的部分可以看到

7
8
y=(a-b)//2
x=(a+b)//2

這就是在執行聯立方程式,因為

1
2
3
4
5
6
7
8
9
10
11
令兩隊分數分別為x及y
x+y=s
x-y=d
解聯立,得
x+y+x-y=s+d
⇒ 2x=s+d
⇒ x=(s+d)//2

x+y-(x-y)=s-d
⇒ 2y=s-d
⇒ y=(s-d)//2

只不過,我的程式裡令s、d為a跟b。

之後,再依照題目要求輸出2隊分數即可(注意分數較高者在前)

結語

以上就是本題題解,倘若有誤或是對於解題仍有疑問,歡迎於底下留言區留言。