| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
贴一段 0ms 168KB 的代码,但总是感觉太长了, 看了一个高手 用的是 8KB 不知是怎么做的,希望高手指点,注释全面,变量名和它的作用密切相关#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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator