POJ 1925 Spiderman
题目大意:
给出n个建筑,每个建筑以两个数x,y表示,x代表它在横轴上的位置,y代表这个建筑的高度。所有建筑的高度都大于等于第一个建筑的高度。所有建筑输入顺序按照x,y从小到达的顺序排列。
蜘蛛侠在第一个建筑上,他要去最后一个建筑救女朋友。一直他每一次摇摆都会到关于建筑对称的位置。求到最后一个建筑的最小摇摆次数。
解题思路:
dp[i]代表着当他到x轴i的位置时最少摇摆了几次。因为每次摇摆他都到了关于被他蛛网固定的建筑的对称位置。那么他的高度在每次切换建筑目标时都是不变的。
下面是代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <algorithm> using namespace std; int min(int a,int b) { if(a>b)a=b; return a; } int max(int a,int b) { if(a<b)a=b; return a; } struct mnod { long long x,y; }node[5005]; int dp[1000005]; int main() { int T; scanf("%d",&T); while(T--) { int n,dis,temp; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%lld%lld",&node[i].x,&node[i].y); } memset(dp,-1,sizeof(dp[0])*(node[n-1].x+2)); dp[node[0].x]=0; for(int i=1;i<n;i++) { dis=sqrt(node[i].y*node[i].y-(node[i].y-node[0].y)*(node[i].y-node[0].y)); for(int j=1;j<=dis;j++) { if(node[i].x-j<node[0].x)break; if(dp[node[i].x-j]==-1)continue; else { temp=min(node[i].x+j,node[n-1].x); if(dp[temp]==-1)dp[temp]=dp[node[i].x-j]+1; else dp[temp]=min(dp[temp],dp[node[i].x-j]+1); } } } printf("%d\n",dp[node[n-1].x]); } return 0; }