题目背景
赛跑
题目描述
SH的跑步成绩一直不太理想。为了帮助SH提高成绩,KC决定和他进行一次赛跑。比赛的起点设在农场主的屋前,他们同时出发,沿着同一方向,直到跑到终点----农场远处的一棵树下。
他们的跑步速度在一些时间段内是恒定的。比如:SH在前3个时间段速度是5,接着6个时间段内速度是10。他们的比赛总时间相同。他们希望能统计出在整个比赛过程中领先顺序的变化次数。举个例子,某个时刻SH领先,下个时刻KC领先,这就是一次领先顺序的变化;如果某个时刻SH领先,接下来一段时间KC赶上来并和SH齐头并进,但最终还是超过了SH,这也是一次领先顺序的变化。
输入格式
第1行:N和M(1 <= N, M <= 1000)。
接下来的N行:每行两个整数,描述SH跑步的一段,分别表示该段SH跑步的速度和持续这种速度的时间。所有的数据范围 [1..1000]。
再接下来的M行:每行两个整数,描述KC跑步的一段,分别表示该段KC跑步的速度和持续这种速度的时间。所有的数据范围 [1..1000]。
输出格式
一行:整个比赛过程中领先顺序的变化次数。
输入输出样例
输入 #1复制
4 3 1 2 4 1 1 1 2 10 2 3 1 2 3 9
输出 #1复制
2
说明/提示
输入:SH在前2个单位时间内速度是1,接着1个单位时间内速度是4,接着1个单位时间内速度是1,最后10个单位时间内速度是2。KC在前3个个单位时间内速度是2,接着2个单位时间内速度是1,最后9个单位时间内速度是3。
输出:比赛开始后KC领先,直到第5个单位时间SH超过KC(第一次领先顺序变化),接着第7个单位时间时,KC又反超SH,变成领先(第二次领先顺序变化)。
思路:
暴力把每一秒他们的距离作比较。
AC代码:
#include <iostream>
using namespace std;
int main(){
int N,M,s=1,result=0;int md=0,cnm=0;
cin >> N >> M;
long long distance[9999999]={0};
for(int i=0;i<N+M;i++){
int a,b;
cin >> a >> b;
if(i<=N-1){
md=md+b;
}
cnm=cnm+b;
while(b>0){
distance[s]=distance[s-1]+a;
s++;b--;
}
}
int n=md+1;
//cout<<"md:"<<md<<"cnm:"<<cnm<<"!"<<endl;
//for(int i=1;i<cnm;i++){
// cout << distance[i] <<" "<<distance[n]-distance[md]<<endl;
// n++;
//}
bool x=1;
n=md+1;int d=1;
for(int i=1;i<md;i++){
if(distance[i]>distance[n]-distance[md]){
if(d==1){
x=1;
}
if(x==0){
result++;
}
x=1;d=2;
}else{
if(d==1){
x=0;
}
if(x==1){
result++;
}
x=0;d=2;
}
n++;
}
cout << result;
return 0;
}