| ||||||||||
| 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 | |||||||||
我比你还郁闷!!你看一下我的成绩就知道了,我交了四十次,硬是没有AC的~~我编到快吐了In Reply To:高手帮忙看看阿~~~why TLE?????~~~~~~~~~~~~~ Posted by:never_gone at 2007-04-21 14:20:06 #include<iostream.h>
#include<fstream.h>
bool flags[64];//木棍使用标记
int sticks[64];//每段木棍的长度
int mini; //木棍最短的可能
int object;
int number;
int remainlength;
bool getIt;
void remove(int length,bool remainf[],int sub[]);
void recover(int length,bool remainflags[],int sub[]);
void find(int length,int position,int target,int remain[],int sub[],bool remainflags[],int n);
void main()
{
// fstream cin("c:\\1.txt",ios::in);
int remain[64];//剩下的木棍
int sub[64];
bool remainflags[64];
int n;
int sum;
int t=0;
while(cin>>n)
{
remainlength=n;
if(!n)break;
sum=0;
for(int i = 0; i < n; i++)
{
cin>>sticks[i];
sum+=sticks[i];
}
for(i=0;i<n-1;i++)//选择排序
{
int lable=i;
for(int j=i+1;j<n;j++)
if(sticks[lable]<sticks[j]) lable=j;
if(i!=lable)
{
sticks[i]^=sticks[lable]^=sticks[i]^=sticks[lable];
}
}
for(i=0;i<n;i++)
cout<<sticks[i]<<' ';
cout<<endl;
mini=sticks[0]-1;
getIt=false;
while((mini<sum) && (!getIt))
{
mini++;
for(i=0;i<64;i++)flags[i]=true;
while(sum%mini!=0)mini++;
number=sum/mini;
getIt=false;
int length=0;
for(int l=0;l<n;l++)
{
if(flags[l])
{
remain[length]=sticks[l];
sub[length]=l;
remainflags[length++]=true;//未使用
}
}
int target=mini-remain[0];
object=target;
remainflags[0]=false;
if(target)find(length,1,target,remain,sub,remainflags,1);
else
{
flags[0]=false;
int count=1;
bool hoho=true;
for(int m=1;m<n;m++)
{
if(sticks[m-1]==sticks[m])
{
flags[m]=false;
count++;
}
else break;
}
if(count==n)break;
int length=0;
for(int l=0;l<n;l++)
{
if(flags[l])
{
remain[length]=sticks[l];
sub[length]=l;
remainflags[length++]=true;//未使用
}
}
int target=mini-remain[0];
object=target;
remainflags[0]=false;
if(target)find(length,1,target,remain,sub,remainflags,count+1);
}
}
t++;
cout<<"第"<<t<<"组测试数据结果:";
cout<<mini<<endl;
}
}
void find(int length,int position,int target,int remain[],int sub[],bool remainflags[],int n)
{
if(position>=length || getIt)return;
if(remain[position]<target)
{
target-=remain[position];
remainflags[position]=false;
find(length,position+1,target,remain,sub,remainflags,n);
int lable1=position+1;
while(lable1<length&& remain[lable1]==remain[position])lable1++;
target+=remain[position];
remainflags[position]=true;
find(length,lable1,target,remain,sub,remainflags,n);
}
else if(target<=remain[position] && target>=remain[length-1])
{
int left=position-1;
int right=length;
int mid;
while((left+1)!=right)
{
mid=(left+right)/2;
if(remain[mid]>target)left=mid;
else if(remain[mid]<target)right=mid;
else
{
remainflags[mid]=false;
cout<<"第"<<n<<" of "<<number<<"根木棍:"<<endl;
n++;
if((n-number)==1)
{
remove(length,remainflags,sub);
getIt=true;
break;
}
remove(length,remainflags,sub);
int remain1[64];
int sub1[64];
bool remainflags1[64];
int length1=0;
for(int l=0;l<remainlength;l++)
{
if(flags[l])
{
remain1[length1]=sticks[l];
sub1[length1]=l;
remainflags1[length1++]=true;//未使用
}
}
int target1=mini-remain1[0];
remainflags1[0]=false;
if(target1)find(length1,1,target1,remain1,sub1,remainflags1,n);
else
{
n++;
if((n-number)==1)
{
getIt=true;
break;
}
}
recover(length,remainflags,sub);
remainflags[mid]=true;
n--;
break;
}
}
position=mid;
find(length,position+1,target,remain,sub,remainflags,n);
int lable1=position+1;
while(lable1<length&& remain[lable1]==remain[position])lable1++;
// target+=remain[position];
// remainflags[position]=true;
find(length,lable1,target,remain,sub,remainflags,n);
}
else//比最小的还要小,没有希望了
{
return;
}
}
void remove(int length,bool remainflags[],int sub[])
{
int first=0;
for(int i=0;i<length;i++)
if(!remainflags[i])
{
if(first++)cout<<'+';
flags[sub[i]]=false;
cout<<sticks[sub[i]];
}
cout<<'='<<mini<<endl;
}
void recover(int length,bool remainflags[],int sub[])
{
// int first;
for(int i=0;i<length;i++)
if(!remainflags[i])
{
// if(first++)cout<<'+';
flags[sub[i]]=false;
// cout<<sticks[sub[i]];
}
// cout<<'='<<mini<<endl;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator