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

所有数据都能过, AC, 0ms!!!

Posted by CodesW at 2016-04-16 16:49:52 on Problem 1011
#include <stdio.h>

int  sticks[64] = {0} ;
int  stickCnt = 0 ;
char used[64] = {0} ;
int  len = 0 ;

void sort(int *sticks, int stickCnt)
{
	int i = 0, j = 0 ;
	int max = 0 ;
	int tmp = 0 ;

	for(i = 0; i < stickCnt - 1; i++)
	{
		max = i ;
		for(j = i+1; j < stickCnt; j++)
			if(sticks[j] > sticks[max])
				max = j ;
		
		if(i != max)
		{
			tmp = sticks[i] ;
			sticks[i] = sticks[max] ;
			sticks[max] = tmp ;
		}
	}
}

int dfs(int usedCnt, int curLen, int pos)
{
	int i = 0 ;

	if(curLen == len)
	{
		if(usedCnt == stickCnt)
			return 1 ;

		pos = 0 ;
		curLen = 0 ;
	}

	for(i = pos; i < stickCnt; i++)
	{
		if(used[i])
			continue ;

		if(curLen + sticks[i] > len)
			continue ;

		used[i] = 1 ;
		if(dfs(usedCnt + 1, curLen + sticks[i], i+1))
			return 1 ;
		used[i] = 0 ;

		if(0 == curLen)
			return 0 ;
		
		while((i < stickCnt) && (sticks[i+1] == sticks[i]))
			i++ ;
	}

	return 0 ;
}

int main(int argc, char *argv[])
{
	int  i = 0 ;
	int  sum = 0 ;

	while(scanf("%d", &stickCnt) && stickCnt)
	{
		sum = 0 ;
		for(i = 0; i < stickCnt; i++)
		{
			scanf("%d", &sticks[i]) ;
			sum += sticks[i] ;
		}

		sort(sticks, stickCnt) ;
		
		for(len = sticks[0]; len <= sum; len++)
		{
			if(sum % len == 0)
			{
				for(i = 0; i < stickCnt; i++)
					used[i] = 0 ;
				
				if(dfs(0, 0, 0))
					break ;
			}
		} 

		printf("%d\r\n", len) ;
	}

	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