結果
問題 |
No.5005 3-SAT
|
ユーザー |
|
提出日時 | 2022-06-24 12:47:01 |
言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 4 ms / 2,000 ms |
コード長 | 1,924 bytes |
コンパイル時間 | 1,685 ms |
実行使用メモリ | 5,460 KB |
スコア | 739 |
最終ジャッジ日時 | 2022-06-24 12:47:09 |
合計ジャッジ時間 | 5,889 ms |
ジャッジサーバーID (参考情報) |
judge13 / judge11 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 100 |
ソースコード
#include <bits/stdc++.h> using namespace std; #pragma GCC target("avx2") #pragma GCC opTimize("O3") #pragma GCC opTimize("unroll-loops") static const int STIME = clock(); static const int TIME_LIMIT = 1900; random_device rnd; mt19937 mt(rnd()); uniform_int_distribution<> rand2047(0, 2047); int A[2048][6]; int li[2048][2]; void calc_li() { for (int i = 0; i < 2048; ++i) { for (int j = 0; j < 3; ++j) { if (A[i][j+3] == 0) li[A[i][j]][0]++; if (A[i][j+3] == 1) li[A[i][j]][1]++; } } return; } vector<int> make_ans_init() { vector<int> ans(2048, -1); for (int i = 0; i < 2048; ++i) { bool flag = true; for (int j = 0; j < 3; ++j) { if (ans[A[i][j]] != -1) { flag = false; break; } } if (!flag) break; for (int j = 0; j < 3; ++j) { ans[A[i][j]] = A[i][j+3]; } } for (int i = 0; i < 2048; ++i) { if (ans[i] == -1) { if (li[i][0] < li[i][1]) { ans[i] = 1; } else{ ans[i] = 0; } } } return ans; } int eval_ans(vector<int> &ans) { int ret = 0; for (int i = 0; i < 2048; ++i) { if (ans[A[i][0]] == A[i][3] && ans[A[i][1]] == A[i][4] && ans[A[i][2]] == A[i][3]) { ++ret; } } return ret; } vector<int> make_ans_yama(vector<int> ans) { for (int i = 0; i < 5; ++i) { int indx = rand2047(mt); ans[indx] = 1 - ans[indx]; } return ans; } void solve() { calc_li(); vector<int> ans = make_ans_init(); int vestscore = eval_ans(ans); while (clock() - STIME < TIME_LIMIT) { vector<int> nans = make_ans_yama(ans); int score = eval_ans(nans); if (score > vestscore) { vestscore = score; ans = nans; } } for (int i = 0; i < 2048; ++i) { cout << ans[2048-i-1]; } cout << "\n"; return; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout << fixed << setprecision(15); solve(); return 0; }