WA求条,我感觉我思路是错的,但样例过了
查看原帖
WA求条,我感觉我思路是错的,但样例过了
1451441
Mii2308楼主2025/7/23 14:09

思路:不考虑字典序:先减大的后减小的

再考虑字典序:编号大的优先减

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;
}
2025/7/23 14:09
加载中...