下落

[问题描述]
在直角坐标系上,有一个小球开始从坐标(x,y) x>0,y>0 处直线下落,每一秒钟一个单位距离,一直到X轴为止。然而,它可能在下落过程中碰到一些障碍物。障碍物可以看成是一些平行于X轴的水平线段,如果小球的Y坐标和障碍物的Y坐标相等,而X坐标在障碍物的两个端点X坐标之间(包括两个端点),这样小球就会延时5秒然后从障碍物的右端继续下落。
现给出小球的初始坐标 (x,y) ,以及每个障碍物的数据(三个整数 y x1 x2,分别表示这个障碍物的Y坐标,左、右端点的X坐标),编程求小球要几称钟才能到达X轴上。
[输入文件:fall.in]
第一行有两个整数x y表示小球初始坐标,1<=x,y<=1000。第二行有一个整数n(n<100),表示有n个障碍物。
下面有n行,每行三个整数(都在1到999之间),分别表示一个障碍物的数据(y x1 x2),其中x1<=x2。障碍物的高度都不相同。
[输出文件:fall.out]
只一个整数,小球下落到X轴的秒数。

[题解]

暴力!

[代码]

var
  xx,yy,n,ans:longint;
  y,x1,x2:array [0..101] of longint;
procedure init;
var
  i:longint;
begin
  readln(xx,yy);
  readln(n);
  for i:=1 to n do
    readln(y[i],x1[i],x2[i]);
  ans:=yy;
end;

procedure qsort(l,r:longint);
var
  i,j,mid,t:longint;
begin
  if l>r then exit;
  i:=l; j:=r;
  mid:=y[(l+r) div 2];
  repeat
    while y[i]>mid do inc(i);
    while y[j]<mid do dec(j);
    if i<=j then
      begin
        t:=y[i]; y[i]:=y[j]; y[j]:=t;
        t:=x1[i]; x1[i]:=x1[j]; x1[j]:=t;
        t:=x2[i]; x2[i]:=x2[j]; x2[j]:=t;
        inc(i); dec(j);
      end;
  until i>j;
  qsort(i,r);
  qsort(l,j);
end;

procedure main;
var
  i:longint;
begin
  for i:=1 to n do
    if (yy>=y[i]) and (x1[i]<=xx) and (xx<=x2[i]) then
      begin
        inc(ans,5);
        xx:=x2[i];
      end;
  write(ans);
end;

begin
  assign(input,'fall.in');
  assign(output,'fall.out');
  reset(input);
  rewrite(output);
  init;
  qsort(1,n);
  main;
  close(input);
  close(output);
end.

原文地址:https://www.cnblogs.com/zyx-crying/p/9319550.html