結果
問題 | No.1837 Same but Different |
ユーザー |
👑 ![]() |
提出日時 | 2022-02-12 01:22:39 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,590 bytes |
コンパイル時間 | 444 ms |
コンパイル使用メモリ | 82,176 KB |
実行使用メモリ | 64,512 KB |
最終ジャッジ日時 | 2024-06-28 00:29:09 |
合計ジャッジ時間 | 5,059 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 22 WA * 1 |
ソースコード
"""https://yukicoder.me/problems/no/1837Aを3の倍数Bを1 mod 3とするあとは総和を合わせないと…Aに対して+1,+1,+1,+1,+1,0,-2,-2,-2,-2,-2でバランスを取れるか…+1,+1,-2でセットなので…とりあえず1000以上くらいの数字だけでA,Bを構築あと、小さい要素を1 or 2個ずつ加えないといけない1個はまじで困る→4個にする2個を考えたい1,4 , 999,1002,10082,3 , 1000,1003,1006あー+1 が増えちゃう!!→ 0,-1 で総裁===答えを見た===気合で頑張るのが正攻法とりあえずAは全部 0 mod 3Bは全部 1 mod 3ここまではok適当に構成したら、数字が合うように3を足していけばok・N = 0 mod 3 の時そのままでok・N = 1 mod 3 の時Aを1個 mod 1 にすればok・N = 2 mod 3 の時Aを2個 mod 1 にする。この時, この2個の数字の和が Bのmin2個の和より小さければok"""import sysfrom sys import stdindef is_ok(A,B):assert sum(A) == sum(B)sa = set()for i in A:for j in A:sa.add(i+j)sb = set()for i in B:for j in B:sb.add(i+j)return sa & sbN = int(stdin.readline())if N % 3 == 0:btype = [-2] * (N//3) + [1] * (2*N//3)A = [3*(i+1) for i in range(N)]B = [A[i]+btype[i] for i in range(N)]print (" ".join(map(str,A)))print (" ".join(map(str,B)))print (is_ok(A,B) , file=sys.stderr)elif N % 3 == 1:btype = [-2] * (N//3) + [1] * (N - N//3)A = [3*(i+1) for i in range(N)]B = [A[i]+btype[i] for i in range(N)]A[-1] += 7B[-1] += 3B[-2] += 3A.sort()B.sort()print (" ".join(map(str,A)))print (" ".join(map(str,B)))print (is_ok(A,B) , file=sys.stderr)else:M = N-2btype = [-2] * (M//3) + [1] * (2*M//3)A = [3*(i+10) for i in range(M)]B = [A[i]+btype[i] for i in range(M)]A.append(1)A.append(4)B.append(B[-1] + 3)B.append(B[-1] + 3)Asum = sum(A)Bsum = sum(B)if Asum >= Bsum:B[-1] += Asum - Bsumelse:rem = Bsum - Asumwhile rem > 0:for j in range(len(A)-1,1,-1):A[j] += 3rem -= 3if rem <= 0:breakA.sort()B.sort()#print (B[-1],A[-1])assert max(A) <= 10000assert max(B) <= 10000print (" ".join(map(str,A)))print (" ".join(map(str,B)))#print (is_ok(A,B) , file=sys.stderr)