题意:
蜘蛛侠为了救女友要在高楼之间使用他的网来穿行,问最少荡几次到目标地点。
分析:
xi坐标最大是1000000,我们可以用dp【i】来表示i坐标是否能达到且最小的次数枚举即可
ACcode:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#define maxn 1000007
#define inf 0x3f3f3f3f
#include <cstring>
#define ll long long
using namespace std;
struct N{
ll x,y;
void in(){
scanf("%I64d%I64d",&x,&y);
}
}my[maxn];
int dp[maxn];
int main(){
int n,loop,ans;
scanf("%d",&loop);
while(loop--){
scanf("%d",&n);
for(int i=1;i<=n;++i)my[i].in();
memset(dp,0x3f,sizeof(dp));
dp[my[1].x]=0;
for(int i=2;i<=n;++i){
int dis=sqrt(my[i].y*my[i].y-(my[i].y-my[1].y)*(my[i].y-my[1].y));
for(int j=max(my[1].x,my[i].x-dis);j<my[i].x;++j){
if(dp[j]==inf)continue;
int k=min(my[n].x,my[i].x+(my[i].x-j));
dp[k]=min(dp[k],dp[j]+1);
}
}
printf("%d\n",dp[my[n].x]==inf?-1:dp[my[n].x]);
}
return 0;
}