FOJ 飞船赛(抓住主要因素,谨防超时)

有N个飞船进行比赛,它们的跑道为直线并互相平行。每个飞船的起跑位置均不相同。第i个飞船从起跑线右边Xi处开始向右行驶(Xi各不相同)。比赛开始后,它能在零时间内加速到最大速度Vi并永远保持此速度。比赛没有终点,即会永远进行下去。

你的任务是算出比赛过程中一共有多少次"超车"。

Input

输入数据由多组数据组成。每组数据格式如下:
第一行为一个整数N(1<=N<=250000)。
接下来的N行,每行两个整数Xi (0≤Xi≤10^6)和Vi(0<Vi<100),描述了一辆飞船的起跑位置和最大速度。
给出的飞船信息按照起跑位置Xi的升序排列,即X1<X2<X3<…<Xn。
最后一组数据N=0,标志输入结束,不需要处理。

Output


对于每组数据,输出仅一行包含一个整数,即"超车"的次数对1000000的模。

Sample Input

4
0 2
2 1
3 8
6 3
0

Sample Output

2


解题思路:

类似于高中物理,不要考虑s,因为题目已经排好序,只要速度大的,就一定会超过其他人。这样省略了好多步骤,不会超时。

接下来就是暴力枚举每一个出现的速度,这里为了便于存数比较,用速度值作为数组的下标,如果元素值不为0,则表示有该速度,之后遍历过程中只用比较数则的下标就可以。

而且因为每组里面有好多组数据,最多的是250000个,如果等每组所有数据超车次数都计数完成后,才取模,则会出现爆int的情况,存不下,所以输入一个就要取模一次。

贴的代码里有具体解释,废话不多说,上代码。

#include<stdio.h>
#include<string.h>
int main()
{
	int i,j,count,n,s,v,a[101];
	while(scanf("%d",&n)&&n!=0)
	{
		memset(a,0,sizeof(a));
		count = 0;     //把每组超过的次数用count表示,先设为0 
		for(i = 0;i < n;i++)    //一组里面有多少辆车 
		{
			scanf("%d %d",&s,&v); 
			a[v]++;   //将速度值作为数组的下标,如果元素值不为0,则表示有该速度,进行下面的比较 
			for(j = v + 1;j < 101;j++ )   //遍历大于已经出现过速度的值,最大速度不会超过100 
			if(a[j])        //该速度已经出现过,所以有比较性 
			count = count + a[j];     //若出现过用超车总次数count加上慢速度的数组值,数组的值即为有几辆慢车 
			count %= 1000000;   
			//因为每组一共有的数据很多,有250000,如果最后才取模的话,count值会很大。所以在里面就要取模,不可以一组完了之后才取模 
		}
		printf("%d\n",count);
	}
	return 0;
}


你可能感兴趣的:(foj,暴力枚举)