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 |
63ms过了,擠进2048名纪念,类似迪杰特斯拉的贪心思路,内存8120K因为王记更新反向距离了搞了一次WA。。。 #include <iostream> #include <stdio.h> #include <cmath> using namespace std; double dist[1010][1010]; double d(int x1, int y1, int x2, int y2){ return sqrt(0.0 + (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)); } inline double mn(double a, double b){ return (a<b) ? a : b; } inline double mx(double a, double b){ return (a>b) ? a : b; } void swp(int &i1, int &i2){ int temp = i1; i1 = i2; i2 = temp; } const double infty = 100000000.0; int main() { int N; while(1){ scanf("%d", &N); if(N == 0) break; int x[1010], y[1010], l[1010]; scanf("%d%d%d", &x[1], &y[1], &l[1]); scanf("%d%d%d", &x[N], &y[N], &l[N]); for(int i = 2; i < N; i++){ scanf("%d%d%d", &x[i], &y[i], &l[i]); } for(int i = 1; i < N; i++){ for(int j = i+1; j <= N; j++){ int x1 = x[i], y1 = y[i], x2 = x[j], y2 = y[j]; int x3,y3,x4,y4; if(l[i]>=0){ x3 = x1+l[i], y3 = y1; } else{ x3 = x1, y3 = y1-l[i]; } if(l[j]>=0){ x4 = x2+l[j], y4 = y2; } else{ x4 = x2, y4 = y2-l[j]; } if(l[i]>=0 && l[j]>=0){ //都是东西的 if(x3>=x2 && x4>=x1){ dist[i][j] = abs(0.0+y1-y2); } else if(x2>x3){ dist[i][j] = sqrt(0.0+(x2-x3)*(x2-x3)+(y2-y3)*(y2-y3)); } else{ dist[i][j] = sqrt(0.0+(x1-x4)*(x1-x4)+(y1-y4)*(y1-y4)); } } else if(l[i]<0 && l[j]<0){ //都是南北的 if(y3>=y2 && y4>=y1){ dist[i][j] = abs(0.0+x1-x2); } else if(y2>y3){ dist[i][j] = sqrt(0.0+(x2-x3)*(x2-x3)+(y2-y3)*(y2-y3)); } else{ dist[i][j] = sqrt(0.0+(x1-x4)*(x1-x4)+(y1-y4)*(y1-y4)); } } else{ if(l[i]<0 && l[j]>=0){ swp(x1,x2), swp(y1,y2), swp(x3,x4), swp(y3,y4); } if(x1<=x2 && x2<=x3 && y2<=y1 && y1<=y4){ dist[i][j] = 0; } else if(x1<=x2 && x2<=x3 && y1>y4){ dist[i][j] = y1-y4; } else if(x1<=x2 && x2<=x3 && y1<y2){ dist[i][j] = y2-y1; } else if(y2<=y1 && y1<=y4 && x2>x3){ dist[i][j] = x2-x3; } else if(y2<=y1 && y1<=y4 && x2<x1){ dist[i][j] = x1-x2; } else if(x2<x1 && y1<y2){ dist[i][j] = d(x1,y1,x2,y2); } else if(x2>x3 && y1<y2){ dist[i][j] = d(x2,y2,x3,y3); } else if(x2<x1 && y1>y4){ dist[i][j] = d(x1,y1,x4,y4); } else{ dist[i][j] = d(x3,y3,x4,y4); } } dist[j][i] = dist[i][j]; } } double estm[1010]; estm[1] = 0; for(int i = 2; i <= N; i++) estm[i] = dist[1][i]; bool used[1010] = {0}; used[1] = 1; while(1){ double MN = infty; int arg = -1; for(int i = 2; i <= N; i++){ if(used[i]) continue; if(estm[i] < MN){ MN = estm[i]; arg = i; } } used[arg] = 1; if(arg == N) break; for(int i = 2; i <= N; i++){ if(used[i]) continue; double newEstm = mx(dist[arg][i], estm[arg]); if(newEstm < estm[i]) estm[i] = newEstm; } } printf("%.2lf\n", estm[N]); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator