https://codeforces.com/contest/1855/problem/C1
https://codeforces.com/contest/1855/problem/C2
主要问题:
1
5
1 2 -4 3 -10
7
1 5
2 5
4 5
4 5
3 5
2 5
1 5
这个答案为什么不可以啊(甚至是test 1中的wrong answer array is not sorted after all the moves (test case 5))
// CF1855C | 20230729 | T3
#include <bits/stdc++.h>
using namespace std;
int t;
int n, a[25];
int fadd = 0, zadd = 0, fnum = 0, znum = 0;
int zzmax = -1, ffmin = 1;
int zzid, ffid;
queue<pair<int, int> > ans;
void z_solve() {
for (int i = 2; i <= n; i++) {
if (a[i - 1] <= a[i]) {
continue;
} else {
int minn = 1000000000, id = 0;
for (int j = 1; j <= n; j++) {
if (a[i - 1] <= a[i] + a[j]) {
minn = min(minn, a[j]);
id = j;
}
}
// if (id == 0) {
// cout << "==\n";
// }
a[i] += minn;
ans.push({i, id});
}
}
}
void f_solve() {
for (int i = n - 1; i >= 1; i--) {
if (a[i] <= a[i + 1]) {
continue;
} else {
int maxx = -1000000000, id = 0;
for (int j = 1; j <= n; j++) {
if (a[i] + a[j] <= a[i + 1]) {
maxx = max(maxx, a[j]);
id = j;
}
}
// if (id == 0) {
// cout << "--\n";
// }
a[i] += maxx;
ans.push({i, id});
}
}
}
void f_turn_z() {
for (int i = 1; i <= n; i++) {
if (zzmax <= abs(ffmin)) {
zzmax += zzmax;
a[zzid] += a[zzid];
ans.push({zzid, zzid});
} else {
break;
}
}
for (int i = 1; i <= n; i++) {
if (a[i] < 0) {
a[i] += a[zzid];
ans.push({i, zzid});
}
}
z_solve();
}
void z_turn_f() {
for (int i = 1; i <= n; i++) {
if (abs(ffmin) <= zzmax) {
ffmin += ffmin;
a[ffid] += a[ffid];
ans.push({ffid, ffid});
} else {
break;
}
}
for (int i = 1; i <= n; i++) {
if (a[i] > 0) {
a[i] += a[ffid];
ans.push({i, ffid});
}
}
f_solve();
}
int main() {
cin >> t;
while (t--) {
while (!ans.empty()) {
ans.pop();
}
cin >> n;
zzmax = -1, ffmin = 1;
fadd = zadd = fnum = znum = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i];
if (a[i] >= 0) {
zadd += a[i];
znum++;
} else {
fadd += a[i];
fnum++;
}
// zzmax = max(zzmax, a[i]);
if (a[i] > zzmax) {
zzmax = a[i];
zzid = i;
}
// ffmin = min(ffmin, a[i]);
if (a[i] < ffmin) {
ffmin = a[i];
ffid = i;
}
}
// cout << zzid << "----------\n";
// cout << ffid << "----------\n";
if (fnum == 0) {
z_solve();
} else if (znum == 0) {
f_solve();
} else {
if (abs(zadd) >= abs(fadd)) {
f_turn_z();
} else {
z_turn_f();
}
}
cout << ans.size() << "\n";
while (!ans.empty()) {
cout << ans.front().first << " " << ans.front().second << "\n";
ans.pop();
}
}
return 0;
}