結果
問題 |
No.5020 Averaging
|
ユーザー |
|
提出日時 | 2024-02-25 16:11:37 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 974 ms / 1,000 ms |
コード長 | 3,340 bytes |
コンパイル時間 | 3,942 ms |
コンパイル使用メモリ | 256,808 KB |
実行使用メモリ | 6,676 KB |
スコア | 27,863,843 |
最終ジャッジ日時 | 2024-02-25 16:12:41 |
合計ジャッジ時間 | 54,699 ms |
ジャッジサーバーID (参考情報) |
judge10 / judge15 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 50 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; #define TARGET 500000000000000000LL inline ll scoreCal(ll a0, ll a1, ll b0, ll b1) { ll newA = (a0 + a1) / 2; ll newB = (b0 + b1) / 2; ll score = max( abs(TARGET-newA), abs(TARGET-newB)); return score; } inline ll scoreCal2(ll a0, ll b0) { return max(abs(TARGET-a0), abs(TARGET-b0)); } int main() { // スタート時点のタイムスタンプ取得 auto start_time = std::chrono::high_resolution_clock::now(); int N; cin >> N; vector<ll> A(N), B(N); for (int i=0; i<N; ++i) { cin >> A[i] >> B[i]; } vector<ll> Aorg, Borg; Aorg = A; Borg = B; #if 1 // 基準スコア作成(1固定で他のカードとペアリング) vector<pair<int, int>> ret; for (int i=0; i<50; ++i) { int u = 0; int v = 0; ll minScore = scoreCal2(A[0], B[0]); for (int j=1; j<N; ++j) { ll score = scoreCal(A[0], A[j], B[0], B[j]); if (score < minScore) { minScore = score; v = j; } } if (v == 0) { break; } ret.push_back(make_pair(u+1, v+1)); ll newA = (A[u] + A[v]) / 2; ll newB = (B[u] + B[v]) / 2; A[u] = A[v] = newA; B[u] = B[v] = newB; } ll minScore = scoreCal2(A[0], B[0]); //cout << "minScore : " << minScore << endl; #else ll minScore = TARGET; #endif // 制限時間いっぱいまでランダムで計算 //ll count = 0; //ll minA, minB; vector<pair<int, int>> ret1; int u; int v; // 終了時点のタイムスタンプ取得 auto end_time = std::chrono::high_resolution_clock::now(); // 経過時間の計算 auto elapsed_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count(); srand(static_cast<unsigned>(time(NULL))); while(true) { //count++; A.clear(); B.clear(); ret1.clear(); A = Aorg; B = Borg; for (int i=0; i<50; ++i) { u = rand()%N; v = rand()%N; while (u == v) { v = rand()%N; } ret1.push_back(make_pair(u+1, v+1)); ll newA = (A[u] + A[v]) / 2; ll newB = (B[u] + B[v]) / 2; A[u] = A[v] = newA; B[u] = B[v] = newB; } ll tmpScore = scoreCal2(A[0], B[0]); if (tmpScore < minScore) { minScore = tmpScore; ret.clear(); ret = ret1; //minA = A[0]; //minB = B[0]; } // 終了時点のタイムスタンプ取得 end_time = std::chrono::high_resolution_clock::now(); // 経過時間の計算 elapsed_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count(); // 経過時間と制限時間の比較 int time_limit = 970; // 制限時間 if (elapsed_time > time_limit) { break; } } //cout << "minScore : " << minScore << endl; //cout << count << endl; //cout << minA << " " << minB << endl; cout << ret.size() << endl; for (auto x : ret) { cout << x.first << " " << x.second << endl; } return 0; }