夜跑

来源:互联网 发布:宋慧乔整容了吗 知乎 编辑:程序博客网 时间:2024/06/05 10:00

题目:

操场400米一圈,navi每晚跑N秒钟,在[Ai,Bi]时间内,以Ci米每秒的速度匀速前进;watashi跑的方向与navi相反,总是以V米每秒的速度,匀速前进。

          若两人同时从同一起点,向相反的方向开跑,那么在N秒内,可以相遇几次?ps:起跑时,不算相遇,若最后时刻两人到达同一位置,算是一次相遇。


输入格式

一个整数 T,表示有多少组测试数据。接下来的 T 组测试数据格式如下:

首先是三个整数,N (1 <= N <= 1000), M (1 <= M <= N), V (1 <= V <= 10)。

接下来的 M 行,每行有三个整数 AiBi (0 <= Ai < Bi <= N) 和 Ci (1 <= Ci <= 10),数据保证所有的 [AiBi) 不相交,且它们的并集恰好为 [0, N)。

输出格式

对于每组测试数据,输出一个整数,表示在 navi 的跑步过程中,他和 watashi 相遇的次数。

样例输入

1100 4 50 25 325 50 450 75 175 100 2

样例输出

1
第一种方法,是我写的,比较麻烦。
#include<stdio.h>#define MAX 1000typedef struct Speed{int from;int to;int speed;}Speed;//ps:刚开始,误以为每个时间段,只会相遇一次void getCount(){int N,M,V,count=0;Speed ss[MAX];scanf("%d%d%d",&N,&M,&V);int i;for(i=0;i<M;i++)scanf("%d%d%d",&ss[i].from,&ss[i].to,&ss[i].speed);double sum1=0,sum2=0;for(i=0;i<M;i++)   //m个时间段,循环判断相遇次数{double  meetTemp=ss[i].from+(400-sum1-sum2)*1.0/(ss[i].speed+V);  //假设在时间段i能相遇,则相遇时间为meetTempdouble  meetT=ss[i].from;  //真正的相遇时间while(meetTemp<=ss[i].to) //若meetTemp<ss[i].to, 则在i时间段可以相遇;循环判断,在该时间段内,是否可以多次相遇{    meetT=meetTemp;sum1=0;   //若相遇,则将sum1,sum2置为0sum2=0;count++;meetTemp=meetTemp+400*1.0/(ss[i].speed+V); //再次假设在时间段i能相遇,求相遇时间meetTemp}sum1+=ss[i].speed*(ss[i].to-meetT);  //若在时间段i内不会再相遇,则求出相遇后,剩余时间内,两人跑的路程sum2+=V*(ss[i].to-meetT);}printf("%d\n",count);}int main(){int T;scanf("%d",&T);int i;for(i=0;i<T;i++)getCount();return 0;}  

第二种方法比较简单,将问题转换一下,两人每次相遇,都会跑完一圈400米,总共跑的路程除以每圈的路程,即为相遇次数。
#include<stdio.h>#define MAX 1000typedef struct Speed{int from;int to;int speed;}Speed;//向相反方向跑,每跑400米,相遇一次void getCount(){int N,M,V; //时间,时间段个数,第二个人的速度int sum=0,times; //两个人跑的总路程,相遇的总次数Speed ss[MAX];scanf("%d%d%d",&N,&M,&V);int i;for(i=0;i<M;i++)scanf("%d%d%d",&ss[i].from,&ss[i].to,&ss[i].speed);sum=sum+V*N; for(i=0;i<M;i++)sum=sum+ss[i].speed*(ss[i].to-ss[i].from);times=sum/400;printf("%d\n",times);}int main(){int T,i;scanf("%d",&T);for(i=0;i<T;i++)getCount();}



0 0