1:Freda的越野跑查看提交统计提问总时间限制: 1000ms 内存限制: 262144kB描述Freda报名参加了学校的越野跑。越野跑共有N人参加,在一条笔直的道路上进行。这N个人在起点处站成一列,相邻两个人之间保持一定的间距。比赛开始后,这N个人同时沿着道路向相同的方向跑去。换句话说,这N个人可以看作x轴上的N个点,在比赛开始后,它们同时向x轴正方向移动。
假设越野跑的距离足够远,这N个人的速度各不相同且保持匀速运动,那么会有多少对参赛者之间发生“赶超”的事件呢?
输入第一行1个整数N。
第二行为N 个非负整数,按从前到后的顺序给出每个人的跑步速度。
对于50%的数据,2<=N<=1000。
对于100%的数据,2<=N<=100000。输出一个整数,表示有多少对参赛者之间发生赶超事件。样例输入5
1 3 10 8 5样例输出7提示我们把这5个人依次编号为A,B,C,D,E,速度分别为1,3,10,8,5。
在跑步过程中:
B,C,D,E均会超过A,因为他们的速度都比A快;
C,D,E都会超过B,因为他们的速度都比B快;
C,D,E之间不会发生赶超,因为速度快的起跑时就在前边。
注意cnt的溢出!!
#include <iostream>
using namespace std;
int n;
int a[100005];
long cnt = 0;
int temp[100005];
void merge(int left, int right, int mid)
{
int index1 = left, index2 = mid+1;
for (int i = left; i <= right; i++) {
temp[i] = a[i];
}
int s = left;
while (index1 <= mid && index2 <= right) {
if (temp[index1] <= temp[index2]) {
a[s++] = temp[index1++];
}
else {
cnt += (mid - index1 + 1);
a[s++] = temp[index2++];
}
} // 1 2 3 4 5
while (index1 <= mid) {
//cnt++;
a[s++] = temp[index1++];
}
while (index2 <= right ) {
//cnt++;
a[s++] = temp[index2++];
}
}
void mymerge(int left, int right)
{
if (left < right)
{
int mid = (left + right) / 2;
mymerge(left, mid);
mymerge(mid + 1, right);
merge(left, right, mid);
}
}
int main()
{
/*freopen("i.txt", "r", stdin);
freopen("o.txt", "w", stdout);*/
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
a[i] = -a[i];
}
mymerge(0, n-1);
/*for (int i = 0; i < n; i++)
{
cout << endl << a[i];
}*/
cout << cnt;
return 0;
}
来源:CSDN
作者:Arvid Y
链接:https://blog.csdn.net/weixin_44489823/article/details/103328439