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

题目意思不明确,大牛指点一下,求什么木棍可以翻转吗,3个不能有公共点,还是任意两个都不能有

Posted by fisheatscats at 2007-11-01 16:20:07 on Problem 3443
#include <iostream>
#include <memory.h>
#include <algorithm>

using namespace std;

const int maxlen=25+1;
const int maxv=13+1;

int visited[maxlen*maxv+1],n;
int maxlength,len[maxv],partlen[4],ending,sum[4];

int search(int index);

int main()
{
	int testcase=0;
	while (cin>>n && n>0)
	{
		testcase++;
		maxlength=0;
		ending=0;
		for (int i=1;i<=n;i++) 
		{
			cin>>len[i];
			ending+=len[i];
		}
		ending=ending/3;
		memset(visited,0,sizeof(visited));
		memset(partlen,0,sizeof(partlen));
		memset(sum,0,sizeof(sum));
		
		search(1);
		
		cout<<"Case "<<testcase<<": "<<maxlength<<endl;
	}
	return 0;
}

int search(int index)
{
	if (index==n)
	{
		int p=0,t=0;
		p=1;
		if (partlen[2]<partlen[p]) p=2;
		if (partlen[3]<partlen[p]) p=3;
		sum[p]++;
		partlen[p]+=len[index];
		t=abs(partlen[3]-partlen[1])+abs(partlen[3]-partlen[2]);
		if (t==0 && partlen[1]>maxlength && sum[1]>1 && sum[2]>1 && sum[3]>1)
		{
			maxlength=partlen[1];
		}
		partlen[p]-=len[index];
		sum[p]--;
		return 0;
	}
	
	int k,temp;
	int cansearch[3]={1,1,1};
	if (partlen[1]==partlen[2])
	{
		cansearch[1]=0;
		if (partlen[2]==partlen[3])
			cansearch[2]=0;
	}
	else  
	{
		if (partlen[1]==partlen[3]) cansearch[2]=0;
		if (partlen[2]==partlen[3]) cansearch[2]=0;
	}
	
	for (k=1;k<=3;k++)
	if (cansearch[k-1])
	{
		partlen[k]+=len[index];	
		sum[k]++;
		if (partlen[k]<=ending)
		switch (visited[partlen[k]]%10)
		{
		case 0:
			{
				visited[partlen[k]]=1;
				search(index+1);
				visited[partlen[k]]=0;
				break;
			}
		case 1:
			{
				visited[partlen[k]]=2;
				search(index+1);
				visited[partlen[k]]=1;
				break;
			}
		case 2:
			{
				if (partlen[k]>maxlength && sum[1]>1 && sum[2]>1 && sum[3]>1) 
					{
						maxlength=partlen[k];
					}
				break;
			}
		}
		
		partlen[k]-=len[index];
		sum[k]--;
	}
	
	search(index+1);
	
	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