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

那组BT数据真够BT我花了10秒中

Posted by 0huzi0 at 2008-08-02 16:36:50 on Problem 1011
#include<iostream>
using namespace std;
struct BKStick
{
	int length;
	int preid;
};

struct MKStick
{
	int length;
	int lastid;
};

int q(BKStick a[],int low,int high)
{
	BKStick key=a[low];
	while(low<high)
	{
		while(low<high && a[high].length>=key.length)high--;
		a[low]=a[high];
		while(low<high && a[low].length<=key.length)low++;
		a[high]=a[low];
	}
	a[low]=key;
	return low;
}
void qs(BKStick a[],int low,int high)
{
	if(low<high)
	{
		int m=q(a,low,high);
		qs(a,low,m-1);
		qs(a,m+1,high);
	}
}
int main()
{
// 	freopen("1.txt","r",stdin);
	BKStick bkstick[64];
	MKStick mkstick[3200];
	int MKlength,ALLlength,BKsum,MKsum,MKSsum;
	int i;
	while(1)
	{
		MKSsum=0;
		ALLlength=0;
		cin>>BKsum;
		if(!BKsum)break;
		for(i=0;i<BKsum;i++)
		{
			cin>>bkstick[i].length;
			bkstick[i].preid=-2;
			ALLlength+=bkstick[i].length;
		}
		qs(bkstick,0,BKsum-1);
		MKlength=bkstick[BKsum-1].length-1;
		MKsum=BKsum;
		while(MKSsum!=MKsum)
		{
			MKlength++;
	    	while(ALLlength%MKlength)
			{
		    	MKlength++;
			}
			MKSsum=0;
	    	MKsum=ALLlength/MKlength;
			for(i=0;i<MKsum;i++)
			{
				mkstick[i].length=0;
				mkstick[i].lastid=-1;
			}
			i=-1;
			while(!(MKSsum==-1 || MKSsum==MKsum))
			{
				i++;
				while(bkstick[i].preid!=-2 && i<BKsum)i++;
				if(i>=BKsum)//退回一步要考虑已经为空的情况
				{
					i=mkstick[MKSsum].lastid;
					mkstick[MKSsum].length-=bkstick[i].length;
					mkstick[MKSsum].lastid=bkstick[i].preid;
					bkstick[i].preid=-2;
					if(mkstick[MKSsum].lastid==-1)
					{
				     	MKSsum--;
						i=mkstick[MKSsum].lastid;
					}
					else
					while(bkstick[i].length==bkstick[1+i].length && i<BKsum)i++;
				}
				else
				if(mkstick[MKSsum].length+bkstick[i].length>MKlength)
				{
					i=mkstick[MKSsum].lastid;
					mkstick[MKSsum].length-=bkstick[i].length;
					mkstick[MKSsum].lastid=bkstick[i].preid;
					bkstick[i].preid=-2;
					if(mkstick[MKSsum].lastid==-1)
					{
				     	MKSsum--;
						i=mkstick[MKSsum].lastid;
					}
					else
					while(bkstick[i].length==bkstick[1+i].length && i<BKsum)i++;
				}
				else
				{
					mkstick[MKSsum].length+=bkstick[i].length;
					bkstick[i].preid=mkstick[MKSsum].lastid;
					mkstick[MKSsum].lastid=i;
					if(mkstick[MKSsum].length==MKlength)
					{
						i=0;
				    	MKSsum++;
					}
				}
			}
		}
		cout<<MKlength<<endl;
	}
	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