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

最多是O(n^3 * L) 优化一下可以O(n^3) 欧这个程序有问题么?为什么会wa 呢?

Posted by Bamboo at 2003-06-13 16:55:19 on Problem 1011
In Reply To:似乎不是NPC的 因为有限制了。。。 Posted by:Bamboo at 2003-06-13 16:16:51
#include <stdio.h>
#include <string.h>

int n,L[101],sum,max,Len,N;

bool got[5001],used[101];
int pre[5001];

/*
void Q_sort(int p,int r){
	if(p >= r) return ;
	int i = p - 1, j = r + 1, x = L[(p + r) / 2],t;
	while(true){
		do j-- while(L[j] > x);
		do i++ while(L[i] < x);
		if(i  >= j) break;
		t = L[i]; L[i] = L[j]; L[j] = t;
	}
	Q_sort(p,j);
	Q_sort(j+1,r);
}

*/

bool test(){
	memset(used,0,sizeof(used));

	int i,j,k;
	for(i=0; i<N; i++){		
		memset(got,0,sizeof(got)); got[0] = true;
		memset(pre,0,sizeof(got));
		for(j=0; j<n; j++)
			if (! used[j] ){
				for(k = L[j]; k <= Len; k++)
					if(got[k - L[j]]){
						pre[k] = j; got[k] = true; 
					}
				if(got[Len]) break;
			}	
		if(! got[Len] ) return 0;
		k = Len;
		while (k > 0){
			used[pre[k]] = true;
			k -= L[pre[k]];
		}
	}


	return true;
}

int main(){
	int i;

	while(scanf("%d",&n), n != 0){
		for(i = max = sum = 0; i<n; i++){
			scanf("%d",&L[i]); sum += L[i];
			if(L[i] > max) max = L[i];
		}

	//	Q_sort(0,n-1);
		for(N = n; N>0; N--)
			if(sum % N == 0){
				Len = sum / N; if(Len < max) continue;
				if(test()){
					printf("%d\n",Len); break;
				}
			}	
	}
	
	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