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 |
简单DP水题,一遍过,应该是O(N3)#include <iostream> #include <stdio.h> #include <cmath> using namespace std; struct pt{ double x,y; pt(){x=y=0;} pt(double x,double y):x(x),y(y){} }; double dis(pt &p1, pt &p2){ return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); } pt start, end; int n; double wall[100][5]; double dist[100][5]; bool ky(pt &p1, pt &p2){ //p1 is x-smaller than p2 for(int i = 0; i < n; i++){ if(wall[i][0] <= p1.x) continue; if(wall[i][0] >= p2.x) break; double wx = wall[i][0]; double wy = p1.y + (p2.y-p1.y)/(p2.x-p1.x)*(wx-p1.x); if(wy <= wall[i][1] || (wy >= wall[i][2] && wy <= wall[i][3]) || wy >= wall[i][4]) return false; } return true; } int main() { start.x = 0, start.y = 5; end.x = 10, end.y = 5; while(1){ scanf("%d", &n); if(n<0) break; for(int i = 0; i < n; i++){ for(int j = 0; j < 5; j++){ scanf("%lf", &wall[i][j]); } } if(ky(start, end)){ printf("10.00\n"); continue; } for(int i = 0; i < n; i++){ for(int j = 1; j < 5; j++){ pt ep(wall[i][0], wall[i][j]); if(ky(start, ep)) dist[i][j] = dis(ep, start); else{ double minDist = 1e10; for(int k = 0; k < i; k++){ for(int l = 1; l < 5; l++){ pt mp(wall[k][0], wall[k][l]); if(ky(mp, ep)){ double newDist = dis(ep,mp) + dist[k][l]; if(newDist < minDist) minDist = newDist; } } } dist[i][j] = minDist; } } } double ans = 1e10; for(int k = 0; k < n; k++){ for(int l = 1; l < 5; l++){ pt mp(wall[k][0], wall[k][l]); if(ky(mp, end)){ double newAns = dis(mp,end) + dist[k][l]; if(newAns < ans) ans = newAns; } } } printf("%.2lf\n", ans); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator