输入
输入中的五行对应五个轮子。
第一个数字表示轮子的转动速度。下一个数字是缺口的数目 W。1 <= W <= 5。接下来的 W 对数字表示每个缺口的起始角度和长度。只有一行,包括一个整数,表示光能够通过这五个轮子的最早时间。如果无解,输出'none'(小写,不含引号)。
样例输出
9
其实这道题目可以简化为:“五辆火车在一个环形轨道上以一定的速度前行,多久之后五辆火车会同时重叠在一起(一部分即可)”
这里注意,五辆火车是有长度的,并且每秒的速度一样,且轨道的长度为360.
然后我的方法如下:
把这5个火车一秒之内开过的地方+1,当某一处经过了5辆火车就可以输出了。
当然每次一秒过后,每个火车的起始位置也不一样了。所以需要更新一下。
具体模拟思想:
确定起点cnt和长度len,每次转一秒就把每个的起点都加上Movespeed(移动速度),就是新的起点,一旦5个点都重叠在一起了,就输出秒数,并结束程序。只是判断重叠点的话,可以巧妙把当前遇到过的地方都加1,如果当前遇到了5次就可以输出i了,这个i指的是转动的次数,0~360,如果转了360次还没遇到的话,再转下去也没有用了,只需输出none
var
i,j,k,p,q:Longint;
count:array[0..359]of Longint;
d:array[1..5] of record
speed,total:Longint;
b:array[1..5,1..2] of Longint;
end;
begin
for i:=1 to 5 do
begin
read(d[i].speed,d[i].total);
for j:=1 to d[i].total do
read(d[i].b[j][1],d[i].b[j][2]);
readln;
end;
for i:=0 to 360 do
begin
fillchar(count,sizeof(count),0);
for j:=1 to 5 do
for k:=1 to d[j].total do
for p:=d[j].b[k,1] to d[j].b[k,1]+d[j].b[k,2] do
if count[p mod 360]=4 then
begin
writeln(i);
halt;
end
else inc(count[p mod 360]);
for j:=1 to 5 do
for k:=1 to d[j].total do
d[j].b[k,1]:=(d[j].b[k,1]+d[j].speed) mod 360;
end;
writeln('none');
end.