题目:
操场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 行,每行有三个整数 Ai, Bi (0 <= Ai < Bi <= N) 和 Ci (1 <= Ci <= 10),数据保证所有的 [Ai, Bi) 不相交,且它们的并集恰好为 [0, N)。
输出格式
对于每组测试数据,输出一个整数,表示在 navi 的跑步过程中,他和 watashi 相遇的次数。
样例输入
1
100 4 5
0 25 3
25 50 4
50 75 1
75 100 2
样例输出
1
第一种方法,是我写的,比较麻烦。
#include<stdio.h> #define MAX 1000 typedef 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能相遇,则相遇时间为meetTemp double meetT=ss[i].from; //真正的相遇时间 while(meetTemp<=ss[i].to) //若meetTemp<ss[i].to, 则在i时间段可以相遇;循环判断,在该时间段内,是否可以多次相遇 { meetT=meetTemp; sum1=0; //若相遇,则将sum1,sum2置为0 sum2=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 1000 typedef 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(); }