社区讨论

%你退货再次求救……

UVA307小木棍 Sticks参与者 7已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@mi7yf22x
此快照首次捕获于
2025/11/21 05:39
4 个月前
此快照最后确认于
2025/11/21 05:39
4 个月前
查看原帖
TLE了,所以各位大佬这代码还有救吗QAQ
CPP
#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;

int n,val[70],sum,maxn,ans;
int factor[70],num;

void DivideFactor()
{
	num=0,factor[++num]=sum;
	for(int i=sum/2;i>=maxn;i--)
		if(sum%i==0) factor[++num]=i;
}

int Eva()
{
	for(int i=num;i>=1;i--)
	{
		int temp=0;
		for(int j=1;j<=n;j++)
		{
			temp+=val[j];
			if(temp==factor[i]) temp=0;
			if(temp> factor[i]) goto nextry;
		}
		if(!temp) return factor[i];
		nextry: ;
	}
	return INT_MAX;
}

void SA()
{
	double temp=3000;
	int test=ans;
	while(temp>1e-8)
	{
		int loc1,loc2;
		do
		{
			loc1=rand()%n+1;
			loc2=rand()%n+1;
		}while(loc1==loc2);
		swap(val[loc1],val[loc2]);
		int now=Eva();
		int dif=now-test;
		if(dif<0 || exp(-dif/temp)*RAND_MAX>rand()) test=now;
		else swap(val[loc1],val[loc2]);
		ans=min(ans,now);
		temp*=0.9978;
	}
}

int main()
{
	//freopen("stick.in" ,"r",stdin );
	//freopen("stick.out","w",stdout);
	srand(99);
	while(1)
	{
		sum=0,ans=INT_MAX,maxn=INT_MIN;
		scanf("%d",&n);
		if(!n) return 0;
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&val[i]);
			sum+=val[i];
			maxn=max(val[i],maxn);
		}
		DivideFactor();
		for(int i=1;i<=5;i++) SA();
		printf("%d\n",ans);
	}
	return 0;
}

回复

10 条回复,欢迎继续交流。

正在加载回复...