【POJ 1925】 Spiderman(dp)
Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 6806 | Accepted: 1361 |
Description
Input
Output
Sample Input
2 6 0 3 3 5 4 3 5 5 7 4 10 4 3 0 3 3 4 10 4
Sample Output
3 -1
最近卡在各种题上,各种不爽。。。昨天开始啃这题,最后也没A,今天搞了搞印象笔记,不得不说,是个好APP,。金巨安利给窝的,后来又跟金巨请教了请教数论相关的知识
刚刚想起来这题,打算接着啃,结果瞟了一眼,立马发现有个Int,感觉会乘爆,甚至确定是这里的问题了……改了交了发,果然=.=
扯远了,这题题意:一个王子or骑士or狂战士or蝙蝠侠or蜘蛛侠。。。恩,蜘蛛侠比较像
在最左边的城堡顶端,公主or......,。在最右端的。。。恩……塔中。。。
现在蜘蛛侠要去救公主,每次他可以选择一个塔顶作为支点,然后荡到右边同高度的未知,也就是右移相同的横坐标(如图所示
规定荡下来不可以着地,也就是绳子要小于等于作为支点的塔高。
问最少需要经过几个塔。如果不存在合法的方案,输出-1。
题目保证第一个塔是起点,并且之后的塔都高于或同高于第一个塔。
题目很友好了……然而卡了一下午不友好的代码……只怪不够强=。=
刚开始我是枚举横坐标,然后找后面的塔,如果合法,就通过这个塔荡过去(更新右边到达的地方的塔数
这样是n*m的,,炸掉了
后来换过来,枚举塔,然后从最左可行的起点到该塔,挨个荡过去,WA。。。
然后今天把一处的int改成long long就过了=.=人生如梦%…………
另外要注意,题目中到达公主塔的定义是碰到即可
代码如下:
#include <iostream> #include <cmath> #include <vector> #include <cstdlib> #include <cstdio> #include <cstring> #include <queue> #include <stack> #include <list> #include <algorithm> #include <map> #include <set> #define LL long long #define Pr pair<int,int> #define fread() freopen("in.in","r",stdin) #define fwrite() freopen("out.out","w",stdout) using namespace std; const int INF = 0x3f3f3f3f; const int msz = 10000; const int mod = 1e9+7; const double eps = 1e-8; int dp[2000100]; pair <LL,LL> pr[5555]; int main() { //fread(); //fwrite(); int t,n,h,pos,mn,nt; scanf("%d",&t); while(t--) { scanf("%d",&n); memset(dp,-1,sizeof(dp)); //读取蜘蛛侠所在塔位置和高度 scanf("%d%d",&pos,&h); for(int i = 1; i < n; ++i) scanf("%lld%lld",&pr[i].first,&pr[i].second); dp[pos] = 0; mn = INF; //枚举塔 for(int i = 1; i < n; ++i) { //printf("x:%lld y:%lld\n",pr[i].first,pr[i].second); //就是这里…………#¥%#¥%¥#% LL x = pr[i].first; LL y = pr[i].second; //枚举左边可行的起点 for(int j = max(pos,(int)x-(int)sqrt((y*y-(y-h)*(y-h))*1.0)); j < x; ++j) { //printf("dp[%d]:%d\n",pos,dp[pos]); if(dp[j] == -1) continue; nt = pr[i].first*2-j; //printf("%d/%lld\\%d\n",pos,pr[j].first,nt); //如果能荡到最右边的塔 if(nt >= pr[n-1].first) { mn = min(mn,dp[j]+1); }else if(dp[nt] == -1 || dp[nt] > dp[j]+1) dp[nt] = dp[j]+1; } } printf("%d\n",mn == INF? -1: mn); } return 0; }