#45318: python 想詢問我寫的東西有什麼問題?


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 臺中市立惠文高級中學
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2025-03-11 12:39:29
h082. 2. 贏家預測 -- 2022年1月APCS | From: [123.192.228.253] | 發表日期 : 2025-02-13 23:11

我的作法是把所有資料都塞在一個二維陣列裡面,然後跟著題意操作陣列,但基本上只能過範例測資

不太確定有問題的地方在哪...

 

彩色好讀版: 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])

 

 
#45320: Re: python 想詢問我寫的東西有什麼問題?


leeguanhan0909@gmail.com (李冠翰)

學校 : 高雄市苓雅區復華高級中學國中部
編號 : 276558
來源 : [36.238.151.3]
最後登入時間 :
2025-03-13 22:32:01
h082. 2. 贏家預測 -- 2022年1月APCS | From: [218.166.14.228] | 發表日期 : 2025-02-14 00:14

我的作法是把所有資料都塞在一個二維陣列裡面,然後跟著題意操作陣列,但基本上只能過範例測資

不太確定有問題的地方在哪...

 

彩色好讀版: 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。希望有用 。

我的答案

 
#45323: Re: python 想詢問我寫的東西有什麼問題?


leeguanhan0909@gmail.com (李冠翰)

學校 : 高雄市苓雅區復華高級中學國中部
編號 : 276558
來源 : [36.238.151.3]
最後登入時間 :
2025-03-13 22:32:01
h082. 2. 贏家預測 -- 2022年1月APCS | From: [218.166.14.228] | 發表日期 : 2025-02-14 17:50

我的作法是把所有資料都塞在一個二維陣列裡面,然後跟著題意操作陣列,但基本上只能過範例測資

不太確定有問題的地方在哪...

 

彩色好讀版: 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])並不是原本的數值,與題意不符。

 
#45325: Re: python 想詢問我寫的東西有什麼問題?


leeguanhan0909@gmail.com (李冠翰)

學校 : 高雄市苓雅區復華高級中學國中部
編號 : 276558
來源 : [36.238.151.3]
最後登入時間 :
2025-03-13 22:32:01
h082. 2. 贏家預測 -- 2022年1月APCS | From: [218.166.14.228] | 發表日期 : 2025-02-14 18:19

我的作法是把所有資料都塞在一個二維陣列裡面,然後跟著題意操作陣列,但基本上只能過範例測資

不太確定有問題的地方在哪...

 

彩色好讀版: 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

 
#45326: Re: python 想詢問我寫的東西有什麼問題?


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 臺中市立惠文高級中學
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2025-03-11 12:39:29
h082. 2. 贏家預測 -- 2022年1月APCS | From: [123.192.228.253] | 發表日期 : 2025-02-14 20:47

原來是錯在這......,有感覺這部分可能有問題,但就是沒發現

太感謝你了!!

 

 
ZeroJudge Forum