两个代码,一个简单并AC,后一个复杂有问题,都是线性的处理,求调后一个
查看原帖
两个代码,一个简单并AC,后一个复杂有问题,都是线性的处理,求调后一个
95186
baen楼主2023/10/23 16:20

第一段:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,ans=0,a[10005];
	cin>>n;
	memset(a,0,sizeof(a));
	for(int i=1;i<=n;i++)
	cin>>a[i];
	sort(a+1,a+1+n);
	for(int i=1;i<n;i++)
	{
		a[i+1]+=a[i];
		a[i]=0;
		ans+=a[i+1];
		for(int j=i+1;j<n;j++)
		{
			if(a[j]>a[j+1])
			swap(a[j],a[j+1]);
			else
			break;
		}
	}
	cout<<ans;
	return 0;
}

第二段:

#include<bits/stdc++.h>
using namespace std;
long long N,n1[10001],n2[10000000],i,j,s,l,ii,iii,min1,min2,ans=0,sum=0;
bool cmp(int x,int y)
{
	return x<y;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>N;
	for(i=1;i<=N;i++)
	{
		cin>>n1[i];
		sum+=n1[i];
	}
	n1[i]=INT_MAX;
	memset(n2,0,sizeof(n2));
	sort(n1+1,n1+1+N,cmp);
	n2[1]=n1[1]+n1[2];
	ans+=n2[1];
	s=1;
	l=1;
	i=3;
	j=3;
	while(i<=N)
	{
		if(n1[j]>n2[l])
		{
			min1=n2[l];
			n2[l]=0;
			l++;
			if(l>s)
			{
			 	min2=n1[j];
			 	j++;
			}
			else if(n1[j]>n2[l])
			{
				min2=n2[l];
				n2[l]=0;
				l++;
			}
			else
			{
				min2=n1[j];
				j++;
			}
		}
		else
		{
			min1=n1[j];
			j++;
			if(n1[j]>n2[l])
			{
				min2=n2[l];
				n2[l]=0;
				l++;
			}
			else
			{
				min2=n1[j];
				j++;
			}
		}
		i=j;
		ans+=min1+min2;
		if(l>s)
		s=l;
		s++;
		for(ii=l;ii<=s;ii++)
		{
			if(min1+min2<n2[ii])
			{
				for(iii=s;iii>=ii;iii--)
				n2[iii]=n2[iii-1];
				n2[ii]=min1+min2;
				break;
			}
			else if(n2[ii]==0)
			{
				n2[ii]=min1+min2;
				break;
			}
		}
	}
	if(n2[l]!=sum)
	ans+=n2[l]+n2[l+1];
	cout<<ans;
	return 0;
}
2023/10/23 16:20
加载中...