| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:请问有人能够将64的那组BT数据控制在1S之内么?In Reply To:请问有人能够将64的那组BT数据控制在1S之内么? Posted by:zentropy at 2007-09-02 16:03:34 这个应该行
#include <iostream>
#include <cstdlib>
using namespace std;
int num[64];
int next[64];
int n;
bool used[64];
int len;
int searched[65][65][50*65];
int cmp(const void* a,const void* b)
{
return *((int*)b)-*((int*)a);
}
inline int sumLen(int m)
{
int sum=0;
for(int i=m; i<n; i++)
{
if(used[i]==false)
sum+=num[i];
}
return sum;
}
void Init(int total, int sum)
{
for(int i=0; i<=total; i++)
{
for(int j=0; j<=total; j++)
{
for(int k=0; k<=sum; k++)
searched[i][j][k]=0;
}
}
}
bool stick(int total, int start, int left)
{
int i;
if(total==n)
return true;
for(i=start; i<n; )
{
if(used[i]==false)
{
if(left>num[i])
{
left-=num[i];
used[i]=true;
if(searched[total+1][start+1][left]==1)
return true;
else if(searched[total+1][start+1][left]==-1)
;
else
{
if(stick(total+1,start+1,left))
{
searched[total+1][start+1][left]=1;
return true;
}
else
searched[total+1][start+1][left]=-1;
}
left+=num[i];
used[i]=false;
if(start==0)
break;
}
else if(left==num[i])
{
used[i]=true;
if(searched[total+1][0][len]==1)
return true;
else if(searched[total+1][0][len]==-1)
;
else
{
if(stick(total+1,0,len))
{
searched[total+1][0][len]=1;
return true;
}
else
searched[total+1][0][len]=-1;
}
used[i]=false;
break;
}
i=next[i];
}
else
i++;
if(sumLen(i)<left)
return false;
}
return false;
}
int main()
{
cin>>n;
int i,j;
int sum;
while(n)
{
sum=0;
for(i=0; i<n; i++)
{
cin>>num[i];
sum+=num[i];
used[i]=false;
}
qsort(num,n,sizeof(int),cmp);
int start=0;
int end=0;
while(end<n)
{
while(end<n&&num[start]==num[end])
end++;
for(j=start; j<end; j++)
{
next[j]=end;
}
start=end;
}
for(i=num[0]; i<=sum; i++)
{
// cout<<"i"<<i<<endl;
if(sum%i==0)
{
Init(n,sum);
len=i;
if(stick(0,0,len))
break;
}
}
cout<<len<<endl;
cin>>n;
}
return 0;
}
> Input
> 64
> 40 40 30 35 35
> 26 15 40 40 40
> 40 40 40 40 40
> 40 40 40 40 40
> 40 40 40 43 42
> 42 41 10 4 40
> 40 40 40 40 40
> 40 40 40 40 40
> 40 40 40 25 39
> 46 40 10 4 40
> 40 37 18 17 16
> 15 40 40 40 40
> 40 40 40 40
> Output
> 454
>
> 虽然AC了,不过这组数据得6S左右,感觉再优化下去我会疯掉的。。这几天就一直在捣鼓这个题目,这个数据死活控制不住。。
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator