原题链接
用大根堆做就很简单
用大根堆存每次取出最大的和第二个最大的,每次两个减一,然后入队.
代码
#include<iostream>
#include<queue>
using namespace std;
const int N=2e5+10;
typedef pair<int,int>PII;
PII s[N];
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
priority_queue<PII> q;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
if(x)q.push({x,i});
}
int ans=0;
while(q.size()>1)
{
PII t1=q.top();
q.pop();
PII t2=q.top();
q.pop();
s[ans++]={t1.second,t2.second};
t1.first--;t2.first--;
if(t1.first)q.push({t1.first,t1.second});
if(t2.first)q.push({t2.first,t2.second});
}
cout<<ans<<endl;
for(int i=0;i<ans;i++)cout<<s[i].first<<" "<<s[i].second<<endl;
}
return 0;
}