open judge Freda的越野跑

雨燕双飞 提交于 2019-12-23 21:49:00

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;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!