結果
| 問題 |
No.5020 Averaging
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-02-25 16:05:02 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 905 ms / 1,000 ms |
| コード長 | 3,340 bytes |
| コンパイル時間 | 2,283 ms |
| コンパイル使用メモリ | 212,296 KB |
| 実行使用メモリ | 6,548 KB |
| スコア | 27,782,167 |
| 最終ジャッジ日時 | 2024-02-25 16:06:20 |
| 合計ジャッジ時間 | 50,242 ms |
|
ジャッジサーバーID (参考情報) |
judge13 / judge10 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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 = 900; // 制限時間
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;
}