結果

問題 No.1015 おつりは要らないです
ユーザー lam6er
提出日時 2025-04-16 00:12:12
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 2,323 bytes
コンパイル時間 217 ms
コンパイル使用メモリ 81,788 KB
実行使用メモリ 104,368 KB
最終ジャッジ日時 2025-04-16 00:13:37
合計ジャッジ時間 4,420 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 4 WA * 2 TLE * 1 -- * 26
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys

def main():
    input = sys.stdin.read().split()
    idx = 0
    N = int(input[idx]); idx +=1
    X = int(input[idx]); idx +=1
    Y = int(input[idx]); idx +=1
    Z = int(input[idx]); idx +=1
    A = list(map(int, input[idx:idx+N]))
    
    for a in A:
        m_i = (a // 1000) + 1
        max_sum = X * 1 + Y * 5 + Z * 10
        if max_sum < m_i:
            print("No")
            return
        
        min_B = float('inf')
        best_c = -1
        best_a = -1
        best_b = -1
        
        max_c = min(Z, (m_i + X + 5 * Y) // 10)
        max_c = min(max_c, Z)
        max_c = min(max_c, (m_i + 100) // 10)
        
        for c in range(max_c, -1, -1):
            remaining = max(m_i - 10 * c, 0)
            sum_ab = None
            
            for delta in range(0, 5):
                s = remaining + delta
                a_part = s % 5
                if a_part > X:
                    continue
                b_part = (s - a_part) // 5
                if b_part <= Y:
                    sum_ab = s
                    break
            
            if sum_ab is None:
                s = remaining + (5 - (remaining % 5)) if remaining % 5 != 0 else remaining
                a_part = s % 5
                if a_part > X:
                    a_part = min(X, s)
                    s = a_part + 5 * ((s - a_part) // 5)
                b_part = (s - a_part) // 5
                if b_part <= Y and s >= remaining:
                    sum_ab = s
                else:
                    a_part = min(X, s)
                    new_s = a_part + 5 * min(Y, (s - a_part + 4) // 5)
                    if new_s >= remaining and (new_s - a_part) // 5 <= Y:
                        sum_ab = new_s
            
            if sum_ab is not None:
                B_c = 10 * c + sum_ab
                if B_c >= m_i and B_c < min_B:
                    min_B = B_c
                    best_c = c
                    best_a = sum_ab % 5
                    best_b = (sum_ab - best_a) // 5
        
        if min_B == float('inf'):
            print("No")
            return
        
        X -= best_a
        Y -= best_b
        Z -= best_c
        
        if X < 0 or Y < 0 or Z < 0:
            print("No")
            return
    
    print("Yes")

if __name__ == '__main__':
    main()
0