思路:不考虑字典序:先减大的后减小的
再考虑字典序:编号大的优先减
Code
#include<iostream>
#include<utility>
#include<vector>
#include<algorithm>
#include<cmath>
#include<queue>
#define PII pair<int,int>
using namespace std;
vector<PII> ansv;
priority_queue<PII> pq;
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);std::cout.tie(0);
int n;cin>>n;
for(int i=1;i<=n;i++){
int t;cin>>t;
pq.push(make_pair(t,i));//second存编号,first存值
}
while(pq.size()){
if(pq.size()==1){
PII t=pq.top();pq.pop();
if(t.first!=0) t.first--;
ansv.push_back(make_pair(t.second,t.second));
if(t.first!=0)pq.push(t);
}else{
PII t1=pq.top();pq.pop();PII t2=pq.top();pq.pop();
if(t1.first!=0) t1.first--;
if(t2.first!=0) t2.first--;
ansv.push_back(make_pair(min(t1.second,t2.second),max(t1.second,t2.second)));
if(t1.first!=0) pq.push(t1);
if(t2.first!=0) pq.push(t2);
}
}
sort(ansv.begin(),ansv.end());
for(int i=0;i<ansv.size();i++){
cout<<ansv[i].first<<" "<<ansv[i].second<<"\n";
}
return 0;
}