// Problem: D. Productive Meeting
// Contest: Codeforces - Codeforces Round #744 (Div. 3)
// URL: https://codeforces.com/problemset/problem/1579/D
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 2022-02-21 20:28:52
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define per(i,l,r) for(int i=(l);i>=(r);i--)
#define ll long long
#define pii pair<int, int>
#define mset(s,t) memset(s,t,sizeof(t))
#define mcpy(s,t) memcpy(s,t,sizeof(t))
#define fir first
#define pb push_back
#define sec second
#define sortall(x) sort((x).begin(),(x).end())
inline int read () {
int x = 0, f = 0;
char ch = getchar();
while (!isdigit(ch)) f |= (ch=='-'),ch= getchar();
while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
return f?-x:x;
}
template<typename T> void print(T x) {
if (x < 0) putchar('-'), x = -x;
if (x >= 10) print(x/10);
putchar(x % 10 + '0');
}
vector<pair<pair<int, int>, int>> ans;
void solve() {
priority_queue<pii> heap;
ans.clear();
int n;
cin >> n;
for (int i =1; i <= n; i ++) {
int t;
cin >> t;
if (t)
heap.push({t, i});
}
int cnt = 0;
while(heap.size() > 1) {
auto a = heap.top(); heap.pop();
auto b = heap.top(); heap.pop();
if (a.fir == 0 || b.fir == 0) break;
cnt ++;
ans.push_back({{a.sec, b.sec}, 1});
if (a.fir - 1 > 0)
heap.push({a.fir - 1, a.sec});
if (b.fir - 1 > 0) {
heap.push({b.fir - 1, b.sec});
}
}
cout << cnt << endl;
for (auto t : ans) {
for (int j = 0; j < t.sec; j++) {
if (t.fir.fir > t.fir.sec) swap(t.fir.fir, t.fir.sec);
cout << t.fir.fir << " " << t.fir.sec << endl;
}
}
}
int main () {
int t;
cin >> t;
while (t --) solve();
return 0;
}
想法没错,每次选择最大和次大的交流,但是这并不是一直满足的,随着交流次数的增加,最终答案最大和次大会发生变化