0分(确信)求助(样例都没过)
查看原帖
0分(确信)求助(样例都没过)
615615
1885384475ye楼主2023/7/13 21:52
#include<bits/stdc++.h>
using namespace std;
long long a[10001],sum,i,j,k,n,b,s;//a[]桶排用,sum体力,ijk循环,n表示有n堆,s存储合并后这堆有几个 
int main()
{
	cin>>n;
	for(i=0;i<n;i++)
	{
		cin>>b;//b临时存储第i堆有几个果子
		a[b]++;//桶排基操 
	}
	for(i=0;i<n;i++)//n-1次操作即可完成 
	{
		for(j=0;j<=10001;j++)
		{
			if(a[j]==0)j++;//要是没有哪堆数量是这么多就pass 
			a[j]--;//数量相等的-1堆 
			s+=j;//加上第j堆的数量 
			for(k=j;k<=10001;k++)//考虑有数量相等的情况,从j(j之前搜过了)开始 
			{
				if(a[k]==0)k++;
				a[k]--;
				s+=k;
				break;
			}
			break;
		}
		sum+=s;
		a[s]++;//合并两堆果子,数量等于这个值的堆数量加一 
		//cout<<i<<" "<<sum<<" "<<s<<endl;//测试用的 
		s=0;
	}
	cout<<sum; 
	return 0;
} 
2023/7/13 21:52
加载中...