結果
問題 |
No.5005 3-SAT
|
ユーザー |
|
提出日時 | 2025-04-13 21:47:54 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 635 ms / 2,000 ms |
コード長 | 2,963 bytes |
コンパイル時間 | 363 ms |
コンパイル使用メモリ | 82,796 KB |
実行使用メモリ | 85,476 KB |
スコア | 44,591 |
最終ジャッジ日時 | 2025-04-13 21:49:03 |
合計ジャッジ時間 | 66,008 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 100 |
ソースコード
import copy import random from time import perf_counter import argparse import sys import math import time class TimeKeeper: def __init__(self): self.start_time = perf_counter() def is_time_over(self, LIMIT): return (perf_counter() - self.start_time) >= LIMIT def time_now(self): return (perf_counter() - self.start_time) class Solver: def __init__(self, N, K, X): self.N = N # 条件の数 self.K = K # 桁 self.X = X # 条件 # C[k][0/1] : k桁目を0/1にすると達成される条件id self.C = [[set() for i in range(2)] for _ in range(K)] for i in range(N): a, b, c, p, q, r = X[i] self.C[a][p].add(i) self.C[b][q].add(i) self.C[c][r].add(i) def calscore(self, ans): # ansは0or1のlist sc = 0 for i in range(self.N): a, b, c, p, q, r = self.X[i] if ans[a] == p or ans[b] == q or ans[c] == r: sc += 1 else: break return sc def solve(self, tk): loop = 0 best_sc = 0 while True: if tk.is_time_over(0.5): break loop += 1 ans = [-1]*self.K for i in range(self.N): a, b, c, p, q, r = self.X[i] kouho = [] if ans[a] == p or ans[b] == q or ans[c] == r: continue if ans[a] == -1: kouho.append((a, p)) if ans[b] == -1: kouho.append((b, q)) if ans[c] == -1: kouho.append((c, r)) if len(kouho) == 0: # print(f"{loop=}, sc:{i}", file=sys.stderr) sc = i if sc > best_sc: print(f"best: {loop=} {sc=}", file=sys.stderr) best_sc = sc best_ans = ans[:] break id, v = random.choice(kouho) ans[id] = v for k in range(self.K): if best_ans[k] == -1: best_ans[k] = 0 sc = self.calscore(best_ans) return best_ans, sc ########################################### def main(DEBUG): tk = TimeKeeper() if DEBUG == True: LIMIT = 1.7 else: LIMIT = 1.7 X = [] for i in range(2048): a, b, c, p, q, r = map(int, input().split()) X.append((a, b, c, p, q, r)) N = 2048 K = 256 solver = Solver(N, K, X) ans, sc = solver.solve(tk) print(*reversed(ans), sep="") print("SC", sc, file=sys.stderr) return if __name__ == '__main__': parser = argparse.ArgumentParser(description='Debug mode') parser.add_argument('--debug', action='store_true', help='Enable debug mode') args = parser.parse_args() main(args.debug)