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 <math.h> typedef struct graph { int x1; int y1; int x2; int y2; double len; int *link; }graph; typedef struct point_def { int x; int y; }point_def; int pnum,vnum,*tres,*res,*hasvisit,maxnum=0,nownum=0; point_def *t2; graph *data; int isp(point_def p1,point_def p2,point_def p3) { if((double)(p2.y-p1.y)/(p2.x-p1.x)==(double)(p3.y-p2.y)/(p3.x-p2.x)) return 1; else return 0; } double cul(int x1,int y1,int x2,int y2) { return sqrt(pow(x1-x2,2)+pow(y1-y2,2)); } void deal(int num) { if(num==pnum) { if(nownum>maxnum) { int i; for(i=1;i<pnum;i++) res[i]=tres[i]; } } else if(nownum+pnum-num<maxnum) return; else { int i; tres[num]=0; deal(num+1); for(i=1;i<=data[num].link[0];i++) if(!hasvisit[data[num].link[i]]) { hasvisit[data[num].link[i]]=1; nownum++; tres[num]=data[num].link[i]; deal(num+1); hasvisit[data[num].link[i]]=0; nownum--; } } } int main() { /*------------------------------------------------------------------------*/ int i,j; scanf("%d %d",&pnum,&vnum); point_def *t1=(point_def *)malloc(sizeof(struct point_def)*(pnum+1)); t2=(point_def *)malloc(sizeof(struct point_def)*(vnum+1)); data=(graph *)malloc(sizeof(struct graph)*(pnum+1)); res=(int *)malloc(sizeof(int)*(pnum)); tres=(int *)malloc(sizeof(int)*(pnum)); hasvisit=(int *)malloc(sizeof(int)*(vnum+1)); memset(res,0,sizeof(int)*(pnum)); memset(tres,0,sizeof(int)*(pnum)); memset(hasvisit,0,sizeof(int)*(vnum+1)); /*------------------------------------------------------------------------*/ for(i=1;i<=pnum;i++) scanf("%d %d",&t1[i].x,&t1[i].y); for(i=1;i<pnum;i++) { data[i].x1=t1[i].x; data[i].y1=t1[i].y; data[i].x2=t1[i+1].x; data[i].y2=t1[i+1].y; data[i].len=cul(data[i].x1,data[i].y1,data[i].x2,data[i].y2); } for(i=1;i<=vnum;i++) scanf("%d %d",&t2[i].x,&t2[i].y); /*------------------构建图----------------------------*/ for(i=1;i<pnum;i++) { int num=0,temp[101]; for(j=1;j<=vnum;j++) { double temp1,temp2; if((temp1=cul(data[i].x1,data[i].y1,t2[j].x,t2[j].y))<=2*data[i].len) if((temp2=cul(data[i].x2,data[i].y2,t2[j].x,t2[j].y))<=2*data[i].len) if(temp1+temp2<=2*data[i].len) temp[++num]=j; } data[i].link=(int *)malloc(sizeof(int)*(num+1)); data[i].link[0]=num; for(j=1;j<=num;j++) data[i].link[j]=temp[j]; } /*-----------------------------------------------------*/ deal(1); /*-----------------------------------------------------*/ point_def result[201]; int result_p[201]; int res_c=0,temp=0; for(i=1;i<pnum;i++) { result[++res_c]=t1[i]; if(res[i]) result[++res_c]=t2[res[i]]; } result[++res_c]=t1[pnum]; for(i=1;i<=res_c;i++) result_p[i]=1; for(i=2;i<res_c;i++) if(isp(result[i-1],result[i],result[i+1])) {result_p[i]=0;temp++;} printf("%d\n",res_c-temp); for(i=1;i<res_c;i++) if(result_p[i]) printf("%d %d ",result[i].x,result[i].y); if(result_p[res_c]) printf("%d %d",result[res_c].x,result[res_c].y); /*-----------------------------------------------------*/ free(data); free(res); free(tres); free(hasvisit); free(t2); free(t1); system("pause"); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator