Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

永远的TLE,感觉提到的主要剪枝都做了啊,,,

Posted by katty at 2012-02-12 19:41:49 on Problem 1011
    最后是借鉴某解题报告修改代码之后过了,但是我自己的这个还是没看出来到底有哪里重复计算了,明明提到的那几个剪枝都做了啊,虽然代码写的有点麻烦。。。我觉得我比AC的代码还多剪了一些的说。。。
=========================================================================


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int mark[70] = {0};
int len[70];
int n,g,min;
int comp(const void *a,const void *b);
int find(int no,int lenth,int now,int count);
int main()
{
	int i,sum;
	while(scanf("%d",&n)&&n)
	{
		sum = 0;
		for(i = 0;i < n;i++)
		{
			scanf("%d",&len[i]);
			sum += len[i];
		}
		qsort(len,n,sizeof(int),comp);
		for(i = len[0];i <=sum;i++)
		{
			if((sum%i) == 0)
			{
				g = sum/i;
				min = 0;
				if(find(0,i,0,0))
				{
					printf("%d\n",i);
					break;
				}
			}
		}
	}
}
int comp(const void *a,const void *b)
{
	return *(int *)b-*(int *)a;
}
int find(int no,int lenth,int now,int count)
{
	int i,j,f;
	if((len[no]+now) == lenth)
	{
		if(count == (g-2))
			return 1;
		mark[no] = 1;
		if(no == min)
		{
			for(i = no+1;i < n;i++)
				if(!mark[i])
				{
					min = i;
					break;
				}
		}
		f = find(min,lenth,0,count+1);
		if(no < min)
			min = no;
		mark[no] = 0;
		return f;
	}
	if((len[no]+now) < lenth)
	{
		mark[no] = 1;
		if(no == min)
		{
			for(i = no+1;i < n;i++)
				if(!mark[i])
				{
					min = i;
					break;
				}
		}
		for(i = no+1;i < n;i++)
		{
			if(!mark[i]&&((len[i]+now+len[no])<lenth))
			{
				f = find(i,lenth,now+len[no],count);
				mark[no] = 0;
				if(f == 0)
				{
					if(now == 0)
						return 0;
					for(j = i+1;j < n;j++)
					{
						if(len[j]!=len[i])
						{
							break;
						}
					}
					i = j-1;
				}
				else
				{
					return 1;
				}
			}
			if(!mark[i]&&((len[i]+now+len[no])==lenth))
			{
				f = find(i,lenth,now+len[no],count);
				mark[no] = 0;
				if(no < min)
					min = no;
				return f;
			}
		}
		if(no < min)
			min = no;
		mark[no] = 0;
		return 0;
	}
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator