Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1586131
  • 博文数量: 399
  • 博客积分: 8508
  • 博客等级: 中将
  • 技术积分: 5302
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-14 09:28
个人简介

能力强的人善于解决问题,有智慧的人善于绕过问题。 区别很微妙,小心谨慎做后者。

文章分类

全部博文(399)

文章存档

2018年(3)

2017年(1)

2016年(1)

2015年(69)

2013年(14)

2012年(17)

2011年(12)

2010年(189)

2009年(93)

分类: LINUX

2010-07-28 16:54:41

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int N= 5010;
const int M=1000010;
int x[N],y[N],dp[M],nb;
int main()
{

 #ifdef LOCAL
 freopen("data.in","r",stdin);
 freopen("data.out","w",stdout);
 #endif
 
 int ntc,n,i,j,k,m;
 cin>>ntc;
 while(ntc--)
 {
  cin>>n;
  for(i=0;i  scanf("%d%d",x+i,y+i);
  memset(dp,-1,(x[n-1]+1)*sizeof(dp[0]));
  m=x[n-1];
  dp[x[0]]=0;
  double h=y[0];   //每次交接点的高度相同,都是y[0],呵呵,你看到了吗
  
  for(i=1;i    int d = sqrt(2*y[i]*h - h*h);   //不会坠落到地上的最长距离 sqrt(y[i]*y[i]-sqare(y[i]-h))
    for(j=1;j<=d;j++){  //枚举交接点
      if(x[i]- j < x[0])  break; //无用状态   //ok
    
      if(dp[x[i]-j]==-1)    continue;//不可达状态  //ok
       k=x[i]+j      if(dp[k]==-1)  dp[k]=dp[x[i]-j]+1;   //第一次到达偏移k处
      else     dp[k]=min(dp[k],dp[x[i]-j]+1);
    } //for
  }//for
  cout< } //while
 return 0;
}
阅读(1081) | 评论(0) | 转发(0) |
0

上一篇:trie 内存池实现

下一篇:优先队列

给主人留下些什么吧!~~