poj1661:Help Jimmy

来源:互联网 发布:关于淘宝美工工作流程 编辑:程序博客网 时间:2024/05/21 10:21
Help Jimmy
Time Limit: 1000MSMemory Limit: 10000KTotal Submissions: 7811Accepted: 2481

Description

"Help Jimmy"是在下图所示的场景上完成的游戏。
poj1661:Help <wbr>Jimmy

场景中包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。

Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终为1米/秒。当Jimmy落到某个平台上时,游戏者选择让它向左还是向右跑,它跑动的速度也是1米/秒。当Jimmy跑到平台的边缘时,开始继续下落。Jimmy每次下落的高度不能超过MAX米,不然就会摔死,游戏也会结束。

设计一个程序,计算Jimmy到底地面时可能的最早时间。

Input

第一行是测试数据的组数t(0 <=t <=20)。每组测试数据的第一行是四个整数N,X,Y,MAX,用空格分隔。N是平台的数目(不包括地面),X和Y是Jimmy开始下落的位置的横竖坐标,MAX是一次下落的最大高度。接下来的N行每行描述一个平台,包括三个整数,X1[i],X2[i]和H[i]。H[i]表示平台的高度,X1[i]和X2[i]表示平台左右端点的横坐标。1<= N <= 1000,-20000 <= X, X1[i], X2[i] <= 20000,0 <H[i] < Y <= 20000(i = 1..N)。所有坐标的单位都是米。

Jimmy的大小和平台的厚度均忽略不计。如果Jimmy恰好落在某个平台的边缘,被视为落在平台上。所有的平台均不重叠或相连。测试数据保证问题一定有解。

Output

对输入的每组测试数据,输出一个整数,Jimmy到底地面时可能的最早时间。

Sample Input

8 17 20 
0 10 8 
0 10 13 
4 14 3

Sample Output

23

Source

POJ Monthly--2004.05.15 CEOI 2000

  这题我a了很久,一直wa,但题目给的数据太少,一直改代码,改的实在不能改了,,最后对照教程里面的改判断条件,就在判断Jimmy能不能跳到某个平台上的那个条件里加了个=号,就ac了。分析:假如i平台和其下面一个的(i-1)平台的左右坐标都相同的话,你不能直接跳过这个平台i-1,而是需要跳到它上面后,再往下走;因为可能存在某种情况,当你从当前平台i往下跳时可能会摔死,而从其下一个平台(i-1)往下跳时,就不会摔死,在此种情况下,就不能越过i-1平台;

  思路:教程上用的是递归,我倒着撸,换掉了递归;首先,从最低的一个平台往下跳,用left_plate[i]和right_plate[i]分别储存它从左边跳下去的最小时间和它从平台右边跳下去的最小时间;接着再一层一层往上爬,每爬上一层就计算它的从左边跳下去的最小时间和它从平台右边跳下去的最小时间;
当你爬上某个平台i后,就要考虑他往下跳的情况:1,直接落地,又有两种情况:1-1,摔死;1-2此时时间就是平台的高度;2,落到平台j上面,有两种情况:2-1,从i跳到j摔死;2-2,没摔死,求最小时间,跳到j后可以往左走或往右走,将他们的时间比较后得到最小时间。


C语言ac代码
#include
#include

#define MAX 10000000;    //时间为很大表示摔死;

struct Plateform   // 平台;
{
   int lx;   //左节点坐标;
   int ry;  //右节点坐标;
   int h;    //高度;
};

int Compare(const void*e1, const void*e2)
{
  Plateform *p1, *p2;
  p1 (Plateform *) e1;
  p2 (Plateform *) e2;

   return p1->h p2->h;
}

int Solve(Plateform plate[1010], int  N, int Max)
{
   int left_plate[1010{0};     //平台的左坐标点到地面的最短距离;
   int right_plate[1010{0};    //平台的有坐标点到地面的最短距离;
   int 1;
   int j, left, right;
   
   left_plate[0plate[0].h;
   right_plate[0plate[0].h;

   //从最地端开始往上遍历;
   for(i=1i<=N; i++)
   {
      //左点坐标;
      for(j i-1>= 0j--)
      {
         if(plate[i].lx >= plate[j].lx && plate[i].lx <= plate[j].ry)  //寻找从i平台可以跳到i以下的某个平台上;
             break;
        
      if(j==-1//直接跳到地面上;
      {
         if(plate[i].h <= Max)           //跳的高度在能承受最大高度内;
            left_plate[i] plate[i].h; //从这个点到地面的最短距离为改点的高度;
         else 
            left_plate[i] MAX;      //跳的高度大于能承受最大高度,左路不通;
      }
      else                          //没有跳到地面;
      {
         if(plate[i].h plate[j].h <= Max)   
          {
            left plate[i].lx plate[j].lx left_plate[j];      
            right plate[j].ry plate[i].lx right_plate[j];
             
             if(left right)
                left_plate[i] left plate[i].h plate[j].h;
             else
                left_plate[i] right plate[i].h plate[j].h;
          }
         else
            left_plate[i] MAX;
      }

      //右点坐标;
      for(j i-1>= 0j--)
      {
         if(plate[i].ry >= plate[j].lx && plate[i].ry <= plate[j].ry)
             break;
      }
      if(j==-1)
      {
         if(plate[i].h <= Max)
            right_plate[i] plate[i].h;
         else 
            right_plate[i] MAX;
      }
      else 
      {
         if(plate[i].h plate[j].h <= Max)
          {
            left plate[i].ry plate[j].lx left_plate[j];
            right plate[j].ry plate[i].ry right_plate[j];
             
             if(left right)
                right_plate[i] left plate[i].h plate[j].h;
             else
                right_plate[i] right plate[i].h plate[j].h;
          }
         else
            right_plate[i] MAX;
      }
   }
   
  left left_plate[N];
  right right_plate[N];

   if(left right)
      return left;
   return right;   
}

int main()
{
  Plateform plate[1010];
   int N, X, Y, Max, t, i;

   scanf("%d"&t);

   while(t--)
   {
      
      scanf("%d%d%d%d"&N, &X, &Y, &Max);
      plate[0].lx X;
      plate[0].ry X;
      plate[0].h Y;

      for(int i=1i<=N; i++)
         scanf("%d%d%d"&plate[i].lx, &plate[i].ry, &plate[i].h);

      qsort(plate, N+1sizeof(Plateform), Compare);             //按从矮到高的顺序排序; 

      printf("%d\n"Solve(plate, N, Max));
   }

   return 0;
}
0 0
原创粉丝点击