結果
| 問題 |
No.5020 Averaging
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-02-25 14:53:28 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 1,000 ms |
| コード長 | 4,389 bytes |
| コンパイル時間 | 2,390 ms |
| コンパイル使用メモリ | 208,948 KB |
| 実行使用メモリ | 6,548 KB |
| スコア | 19,167,042 |
| 最終ジャッジ日時 | 2024-02-25 14:53:33 |
| 合計ジャッジ時間 | 4,656 ms |
|
ジャッジサーバーID (参考情報) |
judge11 / judge12 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 50 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using llu = long long unsigned;
vector<ll> dx = { 0, 0, -1, 1};
vector<ll> dy = {-1, 1, 0, 0};
#define TARGET 500000000000000000LL
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;
}
int main() {
int N;
cin >> N;
vector<ll> A(N), B(N);
for (int i=0; i<N; ++i) {
cin >> A[i] >> B[i];
}
vector<pair<int, int>> ret;
for (int i=0; i<50; ++i) {
int u = 0;
int v = 0;
ll minScore = scoreCal(A[0], A[0], B[0], B[0]);
//cout << "1 - 1 minScore = " << minScore << endl;
for (int j=1; j<N; ++j) {
ll score = scoreCal(A[0], A[j], B[0], B[j]);
//cout << "1 - " << j+1 << " minScore = " << score << endl;
if (score < minScore) {
minScore = score;
v = j;
}
}
if (v == 0) {
if (abs(A[0]-TARGET) > abs(B[0]-TARGET)) {
if (A[0]>TARGET) {
// Aを小さくしたい
int min1 = 1;
int min2 = 2;
ll minV1 = A[min1];
ll minV2 = A[min2];
for (int j=3; j<N; ++j) {
if (A[j] < minV1) {
minV1 = A[j];
min1 = j;
continue;
}
if (A[j] < minV2) {
minV2 = A[j];
min2 = j;
}
}
u = min1;
v = min2;
} else {
// Aを大きくしたい
int max1 = 1;
int max2 = 2;
ll maxV1 = A[max1];
ll maxV2 = A[max2];
for (int j=3; j<N; ++j) {
if (maxV1 < A[j]) {
maxV1 = A[j];
max1 = j;
continue;
}
if (maxV2 < A[j]) {
maxV2 = A[j];
max2 = j;
}
}
u = max1;
v = max2;
}
} else {
if (B[0]>TARGET) {
// Bを小さくしたい
int min1 = 1;
int min2 = 2;
ll minV1 = B[min1];
ll minV2 = B[min2];
for (int j=3; j<N; ++j) {
if (B[j] < minV1) {
minV1 = B[j];
min1 = j;
continue;
}
if (B[j] < minV2) {
minV2 = B[j];
min2 = j;
}
}
u = min1;
v = min2;
} else {
// Bを大きくしたい
int max1 = 1;
int max2 = 2;
ll maxV1 = B[max1];
ll maxV2 = B[max2];
for (int j=3; j<N; ++j) {
if (maxV1 < B[j]) {
maxV1 = B[j];
max1 = j;
continue;
}
if (maxV2 < B[j]) {
maxV2 = B[j];
max2 = j;
}
}
u = max1;
v = max2;
}
}
}
ret.push_back(make_pair(u+1, v+1));
//cout << "1 - " << v+1 << " execute" << endl;
ll newA = (A[u] + A[v]) / 2;
ll newB = (B[u] + B[v]) / 2;
A[u] = A[v] = newA;
B[u] = B[v] = newB;
//for (int i=0; i<N; ++i) { cout << A[i] << " " << B[i] << endl; }
}
cout << ret.size() << endl;
for (auto x : ret) {
cout << x.first << " " << x.second << endl;
}
return 0;
}