社区讨论
%你退货再次求救……
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 条回复,欢迎继续交流。
正在加载回复...