下落

来源:互联网 发布:网络ip电话 编辑:程序博客网 时间:2024/04/27 07:32

[问题描述]
在直角坐标系上,有一个小球开始从坐标(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.
0 0