| ||||||||||
| 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 | |||||||||
奉献一个质量烂的代码 没仔细优化过#include<stdio.h>
#include<cstring>
int line[3][1029][2]={0};
int linep;
int sum,row,valuetemp,numtemp;
int i,j;
bool first=0,last=0,r=0;
int p[12]={0};
struct link
{
int value;
int num;
link*next;
};
struct linkhead
{
int row;
link*linklink;
linkhead*next;
};
int min(int,int,int);
int abs(int);
int cal(int);
int quick(int);
int main()
{
int fullline=0;
int value,num;
linkhead*head=new linkhead;
linkhead*headp=head;
linkhead*headq=NULL;
head->linklink=NULL;
head->next=NULL;
link*linkp=NULL;
link*linkq=NULL;
for(;;)
{
scanf("%d",&row);
if(row==0)break;
headq=new linkhead;
headq->row=row;
headq->next=NULL;
headp->next=headq;
headp=headq;
headq=NULL;
fullline=1;
linep=0;
sum=0;
first=1;
last=0;
for(;;)
{
scanf("%d%d",&value,&num);
if(value==0&&num==0)break;
while(num>0)
{
if(num+sum<row)
{
sum+=num;
line[fullline][linep][0]=value;
line[fullline][linep][1]=sum;
linep++;
break;
}
if(num+sum>=row)
{
line[fullline][linep][0]=value;
line[fullline][linep][1]=row;
num-=row-sum;
linep=0;
sum=0;
fullline++;
}
if(fullline==3)
{
memset( p , 0 , sizeof ( p ) ); //处理每一行
for(i=1;i<=row;)
{
p[1]=p[2];
p[2]=p[3];
if( line[0][p[2]][1]>=i+1 || i==row )
p[3]=p[2];
else p[3]=p[2]+1;
p[4]=p[5];
p[5]=p[6];
if( line[1][p[5]][1]>=i+1 || i==row )
p[6]=p[5];
else p[6]=p[5]+1;
p[7]=p[8];
p[8]=p[9];
if( line[2][p[8]][1]>=i+1 || i==row )
p[9]=p[8];
else p[9]=p[8]+1;
valuetemp=cal(i);
numtemp=quick(i); ///横向快速优化
i+=numtemp;
if(linkp==NULL)
{
linkp=new link;
linkp->value=valuetemp;
linkp->num=numtemp;
linkp->next=NULL;
headp->linklink=linkp;
}
else
{
if(valuetemp==linkp->value)linkp->num+=numtemp;
else
{
linkq=new link;
linkq->value=valuetemp;
linkq->num=numtemp;
linkq->next=NULL;
linkp->next=linkq;
linkp=linkq;
linkq=NULL;
}
}
}
first=0;
for(i=0;line[1][i-1][1]!=row;i++)
{
line[0][i][0]=line[1][i][0];
line[0][i][1]=line[1][i][1];
}
for(i=0;line[2][i-1][1]!=row;i++)
{
line[1][i][0]=line[2][i][0];
line[1][i][1]=line[2][i][1];
}
fullline=2;
}
if(r)
{
if(linkp->value==0)linkp->num+=num-num%row-row;
else
{
linkq=new link;
linkq->value=0;
linkq->num=num-num%row-row;
linkq->next=NULL;
linkp->next=linkq;
linkp=linkq;
linkq=NULL;
}
num=num%row+row;
r=0;
}
if(num>=3*row&&row<350000000)r=1;
}
}
last=1;
memset( p , 0 , sizeof ( p ) );
for(i=1;i<=row;)
{
p[1]=p[2];
p[2]=p[3];
if( line[0][p[2]][1]>=i+1 || i==row )
p[3]=p[2];
else p[3]=p[2]+1;
p[4]=p[5];
p[5]=p[6];
if( line[1][p[5]][1]>=i+1 || i==row )
p[6]=p[5];
else p[6]=p[5]+1;
p[7]=p[8];
p[8]=p[9];
if( line[2][p[8]][1]>=i+1 || i==row )
p[9]=p[8];
else p[9]=p[8]+1;
valuetemp=cal(i);
numtemp=quick(i); ///横向快速优化
i+=numtemp;
if(linkp==NULL)
{
linkp=new link;
linkp->value=valuetemp;
linkp->num=numtemp;
linkp->next=NULL;
headp->linklink=linkp;
}
else
{
if(valuetemp==linkp->value)linkp->num+=numtemp;
else
{
linkq=new link;
linkq->value=valuetemp;
linkq->num=numtemp;
linkq->next=NULL;
linkp->next=linkq;
linkp=linkq;
linkq=NULL;
}
}
}
last=0;
linkp=NULL;
}
for(headp=head->next;headp!=NULL;headp=headp->next)
{
printf("%d\n",headp->row);
linkp=headp->linklink;
for(;linkp!=NULL;linkp=linkp->next)
printf("%d %d\n",linkp->value,linkp->num);
printf("0 0\n");
}
printf("0\n");
return 0;
}
int abs( int a )
{
if( a<0 )return -a;
else return a;
}
int cal(int a)
{
int temp[8];
int max;
temp[0]=abs(line[0][p[1]][0]-line[1][p[5]][0]);
temp[1]=abs(line[0][p[2]][0]-line[1][p[5]][0]);
temp[2]=abs(line[0][p[3]][0]-line[1][p[5]][0]);
temp[3]=abs(line[1][p[4]][0]-line[1][p[5]][0]);
temp[4]=abs(line[1][p[6]][0]-line[1][p[5]][0]);
temp[5]=abs(line[2][p[7]][0]-line[1][p[5]][0]);
temp[6]=abs(line[2][p[8]][0]-line[1][p[5]][0]);
temp[7]=abs(line[2][p[9]][0]-line[1][p[5]][0]);
if(first){temp[0]=temp[1]=temp[2]=0;}
if(last){temp[5]=temp[6]=temp[7]=0;}
for(int i=1;i<8;i++)
if(temp[i]>temp[0])
temp[0]=temp[i];
return temp[0];
}
int quick(int i)
{
int a,c;
a=line[0][p[1]][1]-i;
c=line[2][p[7]][1]-i;
if(first)a=2000000000;
if(last)c=2000000000;
int temp=min(a,line[1][p[4]][1]-i,c);
if(temp<2)return 1;
else return temp;
}
int min(int a , int b , int c)
{
a=a<b?a:b;
a=a<c?a:c;
return a;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator