結果
問題 |
No.968 引き算をして門松列(その3)
|
ユーザー |
![]() |
提出日時 | 2025-04-16 15:44:35 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 5,266 bytes |
コンパイル時間 | 184 ms |
コンパイル使用メモリ | 81,720 KB |
実行使用メモリ | 82,892 KB |
最終ジャッジ日時 | 2025-04-16 15:47:21 |
合計ジャッジ時間 | 2,882 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | WA * 10 |
ソースコード
import sys def is_valid(a, b, c): return a > 0 and b > 0 and c > 0 and a != b and b != c and a != c def is_kadomatsu(a, b, c): if not is_valid(a, b, c): return False nums = sorted([a, b, c]) mid = nums[1] return mid == a or mid == c def check_case(A, B, C, X, Y, Z): min_cost = float('inf') found = False # Case 1: B is the largest, A is middle, C is smallest (B > A > C) # Constraints: # B - x - y > A - x - z → B - y > A - z → z > y + (A - B) # A - x - z > C - y - z → A - x > C - y → y > x + (C - A) # B - x - y > C - y - z → B - x > C - z → z > x + (C - B) # x + z < A # x + y < B # y + z < C # x, y, z >= 0 # We can try small x, y, z values for x in range(0, 100): for y in range(max(x + (C - A) + 1, 0), x + (C - A) + 2): if x + y >= B: continue z1 = y + (A - B) + 1 z2 = x + (C - B) + 1 z = max(z1, z2) if z < 0: continue if x + z >= A: continue if y + z >= C: continue a = A - x - z b_val = B - x - y c_val = C - y - z if is_valid(a, b_val, c_val) and b_val > a and a > c_val: cost = x * X + y * Y + z * Z if cost < min_cost: min_cost = cost found = True # Case 2: B is the largest, C is middle, A is smallest (B > C > A) # Constraints: # B - x - y > C - y - z → B - x > C - z → z > x + (C - B) # C - y - z > A - x - z → C - y > A - x → x > y + (A - C) # B - x - y > A - x - z → B - y > A - z → z > y + (A - B) # x + z < A # x + y < B # y + z < C for x in range(0, 100): for z in range(max(x + (C - B) + 1, 0), x + (C - B) + 2): if x + z >= A: continue y1 = x - (A - C) - 1 if y1 < 0: y = 0 if x - y < (A - C) + 1: continue else: y = y1 if x + y >= B: continue z_check = max(y + (A - B) + 1, x + (C - B) + 1) if z < z_check: continue if y + z >= C: continue a = A - x - z b_val = B - x - y c_val = C - y - z if is_valid(a, b_val, c_val) and b_val > c_val and c_val > a: cost = x * X + y * Y + z * Z if cost < min_cost: min_cost = cost found = True # Case 3: B is the smallest, A is middle, C is largest (C > A > B) # Constraints: # C - y - z > A - x - z → C - y > A - x → x > y + (A - C) # A - x - z > B - x - y → A - z > B - y → y > z + (B - A) # C - y - z > B - x - y → C - z > B - x → x > z + (B - C) # x + z < A # x + y < B # y + z < C for y in range(0, 100): for z in range(max(y + (B - A) + 1, 0), y + (B - A) + 2): if y + z >= C: continue x1 = y + (A - C) + 1 x2 = z + (B - C) + 1 x = max(x1, x2) if x < 0: continue if x + z >= A: continue if x + y >= B: continue a = A - x - z b_val = B - x - y c_val = C - y - z if is_valid(a, b_val, c_val) and c_val > a and a > b_val: cost = x * X + y * Y + z * Z if cost < min_cost: min_cost = cost found = True # Case 4: B is the smallest, C is middle, A is largest (A > C > B) # Constraints: # A - x - z > C - y - z → A - x > C - y → y > x + (C - A) # C - y - z > B - x - y → C - z > B - x → x > z + (B - C) # A - x - z > B - x - y → A - z > B - y → y > z + (B - A) # x + z < A # x + y < B # y + z < C for z in range(0, 100): for x in range(max(z + (B - C) + 1, 0), z + (B - C) + 2): if x + z >= A: continue y1 = x + (C - A) + 1 y2 = z + (B - A) + 1 y = max(y1, y2) if y < 0: continue if x + y >= B: continue if y + z >= C: continue a = A - x - z b_val = B - x - y c_val = C - y - z if is_valid(a, b_val, c_val) and a > c_val and c_val > b_val: cost = x * X + y * Y + z * Z if cost < min_cost: min_cost = cost found = True return min_cost if found else -1 def main(): input = sys.stdin.read().split() idx = 0 T = int(input[idx]) idx +=1 for _ in range(T): A = int(input[idx]) B = int(input[idx+1]) C = int(input[idx+2]) X = int(input[idx+3]) Y = int(input[idx+4]) Z = int(input[idx+5]) idx +=6 if is_kadomatsu(A, B, C): print(0) continue res = check_case(A, B, C, X, Y, Z) print(res if res != float('inf') else -1) if __name__ == '__main__': main()