题意:给定n个塔的横坐标和高度,保证高度各不相同且横坐标递增,蜘蛛侠可以向一个塔射蛛丝然后荡到当前的相对位置,求最少要用多少次蛛丝。
分析:dp[i]代表着当他到x轴i的位置时最少摇摆了几次。因为每次摇摆他都到了关于被他蛛网固定的建筑的对称位置。那么他的高度在每次切换建筑目标时都是不变的。
代码如下
#include<stdio.h>
#include<math.h>
#include<string.h>
int min(int x,int y)
{
return x<y?x:y;
}
int max(int x,int y)
{
return x>y?x:y;
}
int dp[1000005];
struct mnod
{
__int64 x,y;
}node[5005];
void main()
{
int T,i,j,n,dis,temp;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%I64d%I64d",&node[i].x,&node[i].y);
}
memset(dp,-1,sizeof(dp[0])*(node[n-1].x+2));
dp[node[0].x]=0;
for(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(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]);
}
}