poj 1925 各种超时啊

来源:互联网 发布:域名绑定邮箱服务器 编辑:程序博客网 时间:2024/06/05 18:32

今天就这道题,让我总结了一下除算法之外对时间要求过高其他的可能超时的地方:

1、对于数组的初始化太大,比如初始化为10000000,这样容易超时,最好用-1.

2、能用int就别用double,一样的程序我用double来算那个点是否在距离内的时候超时了,用int就AC了,而且速度还很开!

3、对于有些数最好不要开根号,如果比较大小的话就都平方就好了,因为开根号太费时间啦!

4、最好不要有cin,cout,因为对于时间要求紧的题,他们太费时间了,还是用scanf和printf好了!

题目大意:蜘蛛侠为了救自己的女朋友需要从公寓攀岩到塔上,在公寓和塔之间还有很多建筑物,要求求出其最小的吐丝次数就可以到塔的方案!

思路:因为蜘蛛侠的行进时成对称的,所以其转换攀爬点的高度都是一样的,都是公寓的高度,一个建筑物可以覆盖的点的范围求出,然后针对此建筑物进行对覆盖的点进行更新就好啦!起初我是想对建筑物进行更新,然后就是求什么交点最小的啦,然后一些程序就发现各种不会写,然后就又是各种不懂,然后就又借鉴了他人的思路。。。不过也学会了不少的东西的!

#include<iostream>#include<cstdio>#include<string>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<queue>#include<stack>#include<vector>#include<climits>using namespace std; #define rep(i,n) for(i=0; i<(n); i++)#define reph(i,n,m) for(i=(n); i<=(m); i++)//正循环的#define repd(i,n,m) for(i=(n); i>=(m); i--) //负循环的 #define min(a,b)  (a)>(b)?(b):(a)#define fab(a) (a)>0?(a):0-(a)#define ll long long#define arc(a) (a)*(a)#define inf 10000000   //最大值的#define exp 0.0000001     //浮点型的#define N   1000010  //记录开的数组int d[N*2];int a[5005],h[5005];double scale[5005];int main(){    int T,n,i,j;    scanf("%d",&T);    while(T--)    {              scanf("%d",&n);              reph(i,1,n)              {               scanf("%d%d",&a[i],&h[i]);               scale[i]=h[i]*h[i]-(h[i]-h[1])*(h[i]-h[1]);               }              reph(i,1,a[n])              d[i]=inf;              d[a[1]]=0;//apartment的横坐标的              reph(i,2,n)              {                        repd(j,a[i]-1,a[1])                        {                            if(d[j]==inf)                              continue;//                           / double gap=(double)(a[i]-j);用double超时了                             int gap=(a[i]-j);                            if(gap*gap>scale[i])//代表i已经覆盖不了那个地方了                              break;                            int k=2*a[i]-j;                             d[k]=min(d[k],d[j]+1);                            if(k>=a[n])                             d[a[n]]=min(d[j]+1,d[a[n]]);                        }              }              if(d[a[n]]==inf)               printf("-1\n");               else               printf("%d\n",d[a[n]]);                  }    return 0;}