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

贴一段 0ms 168KB 的代码,但总是感觉太长了, 看了一个高手 用的是 8KB 不知是怎么做的,希望高手指点,注释全面,变量名和它的作用密切相关

Posted by 3126016058 at 2014-03-30 13:23:18
#ifndef ONLINE_JUDGE
#define LOCAL
#endif
#include<stdio.h>

const int INF(1<<(sizeof(int)*8-2));
const int VALEN(1005);

/* 虚拟数组 宽度必须大于等于 1 */
class VirtualArray
{
	/* 
	*	1.(0,0)是开始的第一点存储在VAM[0]中。
	*	2.数组存储 0~m(不包括)。
	*	3.oneDimCoo[4]和currentLinePoint[4]是当前位置的坐标和指针
	*	4.二维坐标转化为一维坐标易于存储和比较,求实际值只要将一维坐标值转化为两个二维坐标值即可。
	*/
	typedef struct Section
	{
		__int32 oneDimCoo;
		__int32 value;
	}Section,*SectionPoint;
	Section VAM[VALEN];/* Virtual Array Memory */
	__int32 memory,width;
	__int32 &m,&w;
	/*
	*		[0] [1] [2]
	*		[3] [4] [5]
	*		[6] [7] [8]
	*/
	__int32 oneDimCoo[9];
	SectionPoint currentLinePoint[9];
	__int32 currentOneDimCoo;
	inline void min(__int32 a[])
	{
		if(a[1] < a[0])a[0]=a[1];
		if(a[2] < a[0])a[0]=a[2];
	}
	inline __int32 max(__int32 a,__int32 b)
	{
		return a>b?a:b;
	}
	inline __int32 abs(__int32 X)
	{
		return X>0?X:-1*X;
	}
public:
	VirtualArray():m(memory),w(width)
	{
		VAM[0].oneDimCoo=-1;
		VAM[0].value=INF;
		m=1;
		w=1;/* 默认宽度为 1 (一维数组) */
		currentOneDimCoo=-1;
	}
	/* 重置虚拟数组 */
	bool reset(__int32 width)
	{
		if(width <= 0)return false;/* 宽度至少是 1 */
		m=1;
		w=width;
		currentOneDimCoo=-1;
		return true;
	}
		/* 之后要 start(); 后才能正常使用 */
	bool increase(__int32 value,__int32 length)
	{
		if(m >= VALEN)return false;
		currentOneDimCoo+=length;
		VAM[m].oneDimCoo=currentOneDimCoo;
		VAM[m].value=value;
		++m;
		return true;
	}
	/* 初始化位置信息 必须调用 */
	void start()
	{
		static __int32 vernier;
		static __int32 XPoistion[9]={-1,0,1,-1,0,1,-1,0,1};
		static __int32 YPoistion[9]={-1,-1,-1,0,0,0,1,1,1};
		static __int32 begin,end/* ,middle */,goldenSectionPoint,tmpOneDimCoo;
		vernier=-1;
		while(++vernier < 9)
		{
			oneDimCoo[vernier]=YPoistion[vernier]*w+XPoistion[vernier];
			if(vernier < 4 || m == 1)
			{
				currentLinePoint[vernier]=NULL;
				if(w == 1 && m > 1 && vernier == 2)
				{
					currentLinePoint[2]=VAM+1;
				}
			}
			else if(oneDimCoo[vernier] == 0)
			{
				currentLinePoint[vernier]=VAM+1;
			}
			else if(oneDimCoo[vernier] > VAM[m-1].oneDimCoo)
			{
				currentLinePoint[vernier]=NULL;
			}
			else
			{
				currentLinePoint[vernier]=NULL;
				begin=1;
				end=m-1;/* 包括end */
				while(begin <= end)
				{
					goldenSectionPoint=(int)((end - begin)*0.382/* 1 - 0.618 */)+begin;
					/* middle=(begin + end)/2; */
					if( oneDimCoo[vernier] <= VAM[goldenSectionPoint].oneDimCoo 
						&& oneDimCoo[vernier] > VAM[goldenSectionPoint-1].oneDimCoo)
					{
						currentLinePoint[vernier]=VAM+goldenSectionPoint;
						break;
					}
					else
					{
						if( oneDimCoo[vernier] < VAM[goldenSectionPoint].oneDimCoo )
						{
							end=goldenSectionPoint-1;
						}
						else
						{
							begin=goldenSectionPoint+1;
						}
					}
				}
			}
		}
	}
	/* 获取当前位置 */
	__int32 getCurrentPosition()
	{
		return oneDimCoo[4];
	}
	/* 返回true:未结束 返回false:已经结束 */
	bool nextPoistion()
	{
		static __int32 vernier;
		vernier=-1;
		while(++vernier < 9)
		{
			if(currentLinePoint[vernier])
			{
				if(oneDimCoo[vernier] >= currentLinePoint[vernier]->oneDimCoo)
				{
					if(currentLinePoint[vernier] < VAM+m-1)
					{
						++currentLinePoint[vernier];
					}
					else
					{
						currentLinePoint[vernier]=NULL;
					}
				}
			}
			else
			{
				if(oneDimCoo[vernier] == -1)
				{
					currentLinePoint[vernier]=VAM+1;
				}
			}
			++oneDimCoo[vernier];
		}
		if(currentLinePoint[4])return true;
		else return false;
	}
	/* 返回INF:数组结束  返回其它值:最大差值 */
	__int32 getMaximumDifference()
	{
		static __int32 difference,centralValue;
		static __int32 vernier;
		if(!currentLinePoint[4])return INF;
		difference=0;
		centralValue=currentLinePoint[4]->value;
		if(oneDimCoo[4]%w != 0)/* 不是左边界 */
		{
			vernier=-1;
			while(++vernier < 3)
			{
				if(currentLinePoint[vernier*3])
				{
					difference=max(difference,abs(centralValue - currentLinePoint[vernier*3]->value ));
				}
			}
		}
		if(currentLinePoint[1])
		{
			difference=max(difference,abs(centralValue - currentLinePoint[1]->value ));
		}
		if(currentLinePoint[7])
		{
			difference=max(difference,abs(centralValue - currentLinePoint[7]->value ));
		}
		if((oneDimCoo[4]+1)%w != 0)/* 不是右边界 */
		{
			vernier=-1;
			while(++vernier < 3)
			{
				if(currentLinePoint[vernier*3+2])
				{
					difference=max(difference,abs(centralValue - currentLinePoint[vernier*3+2]->value ));
				}
			}
		}
		return difference;
	}
	/* 三行都存在 横纵压缩*/
	bool hasThreeLinesSame()
	{
		static __int32 vernier;
		static __int32 move[3];
		if(currentLinePoint[0] == currentLinePoint[1] && currentLinePoint[1] == currentLinePoint[2] && currentLinePoint[2] != NULL
		&& currentLinePoint[3] == currentLinePoint[4] && currentLinePoint[4] == currentLinePoint[5] && currentLinePoint[5] != NULL
		&& currentLinePoint[6] == currentLinePoint[7] && currentLinePoint[7] == currentLinePoint[8] && currentLinePoint[8] != NULL)
		{
			vernier=-1;
			while(++vernier < 3)
			{
				move[vernier]=currentLinePoint[3*vernier+1]->oneDimCoo - oneDimCoo[3*vernier+1];
			}
			min(move);
			--move[0];/* 未包含全部 为了让 oneDimCoo[8] 正常进入 */
			if(move[0] > 0)
			{
				vernier=-1;
				while(++vernier < 9)
				{
					oneDimCoo[vernier]+=move[0];
				}
				return true;
			}
		}
		return false;
	}
	/* 三行至少有一行不存在 仅横压缩*/
	bool hasLessThreeLinesSame()
	{
		static __int32 vernier;
		static __int32 move[3];
		static __int32 longHorizontal;
		if(currentLinePoint[0] == currentLinePoint[1] && currentLinePoint[1] == currentLinePoint[2]
		&& currentLinePoint[3] == currentLinePoint[4] && currentLinePoint[4] == currentLinePoint[5] && currentLinePoint[4] !=NULL
		&& currentLinePoint[6] == currentLinePoint[7] && currentLinePoint[7] == currentLinePoint[8]
		&& (currentLinePoint[1] == NULL || currentLinePoint[7] == NULL))
		{
			longHorizontal=((oneDimCoo[4]/w+1)*w-1) - oneDimCoo[4];
			vernier=-1;
			while(++vernier < 3)
			{
				if(currentLinePoint[3*vernier+1])
				{
					move[vernier]=currentLinePoint[3*vernier+1]->oneDimCoo - oneDimCoo[3*vernier+1];
				}
				else
				{
					move[vernier]=longHorizontal;
				}
			}
			min(move);
			--move[0];/* 未包含全部 为了让 oneDimCoo[2] 正常进入 */
			if(move[0] > 0)
			{
				vernier=-1;
				while(++vernier < 9)
				{
					oneDimCoo[vernier]+=move[0];
				}
				return true;
			}
		}
		return false;
	}
};

VirtualArray va;

/* 下一位置的开头减去上一个位置的开头 */
void coundPrint()
{
	int diff,difft,oneDimCooBegin=0;
	diff=va.getMaximumDifference();
	while(va.nextPoistion())
	{
		difft=va.getMaximumDifference();
		if(difft != diff)
		{
			printf("%d %d\n",diff,va.getCurrentPosition()-oneDimCooBegin);
			oneDimCooBegin=va.getCurrentPosition();
			diff=difft;
		}
		if(!va.hasThreeLinesSame())
		{
			va.hasLessThreeLinesSame();
		}
	}
	printf("%d %d\n",diff,va.getCurrentPosition()-oneDimCooBegin);
}

int main()
{
#ifdef LOCAL
	freopen("in.in","r",stdin);
#endif
	int width,value,length;
	while(scanf("%d",&width)!=EOF && width)
	{
		printf("%d\n",width);
		va.reset(width);
		while(scanf("%d%d",&value,&length)!=EOF && length > 0)
		{
			va.increase(value,length);
		}
		va.start();
		coundPrint();
		puts("0 0");
	}
	puts("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