夜跑

题目:

操场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 相遇的次数。

样例输入
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();
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值