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 |
修改提交N次了,还是超时,晒代码,请大虾指教:#include<stdio.h> #include<stdlib.h> #include<math.h> typedef struct mode { int x; int y,a,b; }data; typedef struct node { int x; int y; }re; static int line; int max(data* d,int s); void write(data* d); void compute(data* d,re* r,int line); void print(re* r,int line); int main(void) { extern int line; data d[255]; re r[255]; while(scanf("%d",&line) && line != 0) { write(d); compute(d,r,line); print(r,line); } printf("0\n"); return 0; } void write(data* d) { int i,s=0; int num; int time; for(i=0;i<255;i++) d[i].y=0; i=0; while(scanf("%d %ld",&num,&time) && (num!=0||time!=0)) { d[i].x=num; d[i].y=time; d[i].a=s; s+=time; d[i].b=s; i++; } } void compute(data* d,re* r,int line) { int i,j=0; int s; for(i=0;i<255;i++) r[i].y=0; for(i=0;d[i].y!=0;i++) { for(s=d[i].a;s<d[i].b&&s<d[i].a+line+2;s++) { if(s==0) { r[j].x=max(d,s); r[j].y=1; } else { if(r[j].x==max(d,s)) r[j].y++; else { j++; r[j].x=max(d,s); r[j].y=1; } } } if(s!=d[i].b) { if(d[i].y-2*line-2>0) { if(r[j].x==0) r[j].y+=d[i].y-2*line-2; else { j++; r[j].x=0; r[j].y=d[i].y-2*line-2; } s+=d[i].y-2*line-2; } for(;s<d[i].b;s++) { if(r[j].x==max(d,s)) r[j].y++; else { j++; r[j].x=max(d,s); r[j].y=1; } } } } } int max(data* d,int s) { extern int line; int i,j; int der[8]; int res[8],m; int ma,S; der[0]=-1; der[1]=1; der[2]=-1*line; der[3]=line; der[4]=-1*line-1; der[5]=-1*line+1; der[6]=line-1; der[7]=line+1; for(i=0;i<255;i++) { if(d[i].y==0) break; } S=d[i-1].b; for(i=0;i<255;i++) if(d[i].a<=s&&d[i].b>s) break; m=d[i].x; ma=-1; for(i=0;i<8;i++) { if(s+der[i]>=0 && s+der[i]<S) { for(j=0;j<255;j++) if(d[j].a<=s+der[i]&&d[j].b>s+der[i]) break; res[i]=fabs(m-d[j].x); switch(i) { case 0: case 4: case 6:if(s%line==0) res[i]=-1;break; case 1: case 5: case 7:if((s+1)%line==0) res[i]=-1;break; } } else res[i]=-1; if(ma<res[i]) ma=res[i]; } /*=res[0]; for(i=0;i<8;i++) if(ma<res[i]) ma=res[i];*/ return ma; } void print(re* r,int line) { int i; printf("%d\n",line); for(i=0;i<255;i++) { if(r[i].y==0) break; printf("%d %ld\n",r[i].x,r[i].y); } printf("0 0\n"); } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator