30Re求调
查看原帖
30Re求调
597968
DONGRUIHENG楼主2025/8/2 22:46
#include<bits/stdc++.h>
#define inf 0x3f3f3f
using namespace std;
int n,a[20001],x,xx,ans;
queue<int>q1;
queue<int>q2;
int main(){
	scanf("%d",&n);
	if(n==1){
		cout<<"0";
		return 0;
	}
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
		a[x]++;
	}
	for(int i=1;i<=20000;i++)
		while(a[i]--)q1.push(i);
	while(!q1.empty()||q2.size()>1){
		if((q1.empty()?inf:q1.front())<=(q2.empty()?inf:q2.front())){xx=q1.front();q1.pop();}
		else{xx=q2.front();q2.pop();}
		if((q1.empty()?inf:q1.front())<=(q2.empty()?inf:q2.front())){xx+=q1.front();q1.pop();}
		else{xx+=q2.front();q2.pop();}
		q2.push(xx);
		ans+=xx;
	}
	printf("%d",ans);
	return 0;
}

可以证明处于while循环时q1.size()+q2.size()>=2

思路见https://www.luogu.com.cn/article/i4jbtufk

2025/8/2 22:46
加载中...