我的作法是把所有資料都塞在一個二維陣列裡面,然後跟著題意操作陣列,但基本上只能過範例測資
不太確定有問題的地方在哪...
彩色好讀版: gist連結 (內含我寫的三個版本.......但全都不能AC)
from operator import mul |
我的作法是把所有資料都塞在一個二維陣列裡面,然後跟著題意操作陣列,但基本上只能過範例測資
不太確定有問題的地方在哪...
彩色好讀版: gist連結 (內含我寫的三個版本.......但全都不能AC)
from operator import mul
n, m = map(int, input().split())
data = list(map(list, # [戰力, 應變力, 失敗場數, 編號]
zip(map(int, input().split()), # 戰力
map(int, input().split()), # 應變力
[0] * n, # 失敗場數, 預設為 0
range(1, n + 1)))) # 編號
data = [i[1] for i in sorted(zip(map(int, input().split()), data))]
while len(data) > 1:
win, loss = [], []
for i in range(1, len(data), 2):
mul_a, mul_b = mul(*data[i - 1][:2]), mul(*data[i][:2]) # 戰力 * 應變力
# 確保排序在前的始終是贏家 (i - 1 是贏家, i 是輸家)
if mul_a < mul_b:
data[i], data[i - 1] = data[i - 1], data[i]
mul_a, mul_b = mul_b, mul_a
data[i - 1][0] += mul_b // (2 * data[i - 1][1]) # a + cd // 2b
data[i - 1][1] += mul_b // (2 * data[i - 1][0]) # b + cd // 2a
data[i][0] += data[i][0] // 2 # c + c // 2
data[i][1] += data[i][1] // 2 # d + d // 2
data[i][2] += 1 # 失敗場數加 1
win.append(data[i - 1])
if data[i][2] < m:
loss.append(data[i])
if len(data) & 1:
win.append(data[-1])
data = win + loss
print(data[0][-1])
我看不太出來哪裡有問題,但我有一個反例測資
5 1
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
答案應為4,但第一個版本跑出來的是1,第二、三跑出答案是5。希望有用 。
我的作法是把所有資料都塞在一個二維陣列裡面,然後跟著題意操作陣列,但基本上只能過範例測資
不太確定有問題的地方在哪...
彩色好讀版: gist連結 (內含我寫的三個版本.......但全都不能AC)
from operator import mul
n, m = map(int, input().split())
data = list(map(list, # [戰力, 應變力, 失敗場數, 編號]
zip(map(int, input().split()), # 戰力
map(int, input().split()), # 應變力
[0] * n, # 失敗場數, 預設為 0
range(1, n + 1)))) # 編號
data = [i[1] for i in sorted(zip(map(int, input().split()), data))]
while len(data) > 1:
win, loss = [], []
for i in range(1, len(data), 2):
mul_a, mul_b = mul(*data[i - 1][:2]), mul(*data[i][:2]) # 戰力 * 應變力
# 確保排序在前的始終是贏家 (i - 1 是贏家, i 是輸家)
if mul_a < mul_b:
data[i], data[i - 1] = data[i - 1], data[i]
mul_a, mul_b = mul_b, mul_a
data[i - 1][0] += mul_b // (2 * data[i - 1][1]) # a + cd // 2b
data[i - 1][1] += mul_b // (2 * data[i - 1][0]) # b + cd // 2a
data[i][0] += data[i][0] // 2 # c + c // 2
data[i][1] += data[i][1] // 2 # d + d // 2
data[i][2] += 1 # 失敗場數加 1
win.append(data[i - 1])
if data[i][2] < m:
loss.append(data[i])
if len(data) & 1:
win.append(data[-1])
data = win + loss
print(data[0][-1])
我看不太出來哪裡有問題,但我有一個反例測資5 1
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
答案應為4,但第一個版本跑出來的是1,第二、三跑出答案是5。希望有用 。
我看出來了。
在這兩行
data[i - 1][0] += mul_b // (2 * data[i - 1][1]) # a + cd // 2b
data[i - 1][1] += mul_b // (2 * data[i - 1][0]) # b + cd // 2a
第一行已經把data[i-1][0]改掉,導致第二行在計算(2*data[i-1][0])並不是原本的數值,與題意不符。
我的作法是把所有資料都塞在一個二維陣列裡面,然後跟著題意操作陣列,但基本上只能過範例測資
不太確定有問題的地方在哪...
彩色好讀版: gist連結 (內含我寫的三個版本.......但全都不能AC)
from operator import mul
n, m = map(int, input().split())
data = list(map(list, # [戰力, 應變力, 失敗場數, 編號]
zip(map(int, input().split()), # 戰力
map(int, input().split()), # 應變力
[0] * n, # 失敗場數, 預設為 0
range(1, n + 1)))) # 編號
data = [i[1] for i in sorted(zip(map(int, input().split()), data))]
while len(data) > 1:
win, loss = [], []
for i in range(1, len(data), 2):
mul_a, mul_b = mul(*data[i - 1][:2]), mul(*data[i][:2]) # 戰力 * 應變力
# 確保排序在前的始終是贏家 (i - 1 是贏家, i 是輸家)
if mul_a < mul_b:
data[i], data[i - 1] = data[i - 1], data[i]
mul_a, mul_b = mul_b, mul_a
data[i - 1][0] += mul_b // (2 * data[i - 1][1]) # a + cd // 2b
data[i - 1][1] += mul_b // (2 * data[i - 1][0]) # b + cd // 2a
data[i][0] += data[i][0] // 2 # c + c // 2
data[i][1] += data[i][1] // 2 # d + d // 2
data[i][2] += 1 # 失敗場數加 1
win.append(data[i - 1])
if data[i][2] < m:
loss.append(data[i])
if len(data) & 1:
win.append(data[-1])
data = win + loss
print(data[0][-1])
我看不太出來哪裡有問題,但我有一個反例測資5 1
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
答案應為4,但第一個版本跑出來的是1,第二、三跑出答案是5。希望有用 。
我看出來了。
在這兩行data[i - 1][0] += mul_b // (2 * data[i - 1][1]) # a + cd // 2b
data[i - 1][1] += mul_b // (2 * data[i - 1][0]) # b + cd // 2a第一行已經把data[i-1][0]改掉,導致第二行在計算(2*data[i-1][0])並不是原本的數值,與題意不符。
把NA(55%)的那一版的那兩行改掉即可AC。
temp= mul_b // (2 * data[arr[i - 1]][1]) # a + cd // 2b
data[arr[i - 1]][1] += mul_b // (2 * data[arr[i - 1]][0]) # b + cd // 2a
data[arr[i - 1]][0] +=temp