rt
题目描述
鱼大大每天上班的路程中有一条又长又直主干道。这类主干道一般会有一个特点就是拥有绿波速度。但是鱼大大经过的这条主干道没有把这个绿波速度标注出来,鱼大大只能靠自己的经验来简单计算一下。鱼大大发现了每个路口绿灯亮起后xx秒钟,下一个路口的绿灯便会亮起,并持续yy秒之后变回红灯。凭着多年的开车经验,鱼大大粗略的估算了每个红绿灯之间的距离aiai,现在鱼大大把这些数据以及他的平均车速s(m/s)s(m/s)告诉你,请你帮她计算能否在第一个绿灯亮起后,以该平均车速通过接下来的所有路口?若不能则计算能通过的路口数量。
------------------------------------------------------------
绿波速度是指在某一个红绿灯绿灯时,以规定的某一速度行驶,将一路畅行驶过接下来的所有路口而不会遇到红灯。
规定第一个绿灯亮起时,鱼大大会在第一时间以平均车速通过。忽视每个路口的距离(每个路口的距离视作0m做处理)
规定:所有数据只考虑一次绿灯的情况,无需考虑绿灯变红再变绿时通过的情况
输入格式
所有输入数据从road.in文件中读取。
第一行2个整数n,sn,s,分别表示红绿灯的数量以及鱼大大的平均车速(m/s)。
接下来n - 1行每行3个整数ai,x,yai,x,y,分别为第i个红绿灯(从第2个开始)距上一个红绿灯的路程、距上一个红绿灯的绿灯亮起的时间差以及持续的时间
输出格式
所有输出数据输出到road.out文件
一行,表示能通过路口的最大数量,若是全能通过则输出"YES!";
样例
Input 1
5 10
30 2 20
50 5 10
120 15 30
100 5 10
Output 1
3
Input 2
5 10
30 2 20
50 5 10
120 10 30
100 5 10
Output 2
YES!
数据范围
对于10%的数据,n = 2;
对于50%的数据,n,s ≤ 20;
对于100%的数据,n,s ≤ 10000;
样例解释
样例一解释:
路程共5个红绿灯,鱼大大车速为10m/s.
第1个绿灯亮起后,鱼大大开始通行,第一个路口肯定能过。
行驶到第2个路口时,总耗时3秒,绿灯会在第2秒时亮起,第22秒结束,可通过。
行驶到第3个路口时,总耗时8秒,绿灯会在第7秒时亮起,第17秒结束,可通过。
行驶到第4个路口时,总耗时20秒,绿灯会在第22秒时亮起,此时为红灯,不能通过,最大通过路口数量为3。
规定:所有数据只考虑一次绿灯的情况,无需考虑绿灯变红再变绿时通过的情况
代码
#include<bits/stdc++.h>
using namespace std;
struct node{
int s;
int t1;
int t2;
}a[100005];
int main()
{
// freopen("road.in","r",stdin);
// freopen("road.out","w",stdout);
int n,v,ans=1,lighttime=0,downtime;
double alltime=0;
scanf("%d%d",&n,&v);
for(int i=2;i<=n;i++)
{
scanf("%d%d%d",&a[i].s,&a[i].t1,&a[i].t2);
}
for(int i=2;i<=n;i++)
{
lighttime+=a[i].t1;
downtime=lighttime+a[i].t2;
alltime+=1.0*a[i].s/v;
if(lighttime<=alltime and downtime>=alltime) ans++;
else
{
break;
}
}
if(ans==n) printf("YES!");
else printf("%d",ans);
return 0;
}
freopen为了测试方便注释了