CCF认证2018092-买菜

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Zee_Chao/article/details/87859361

本人初学,水平有限,若有不足,恳请赐教!

 根据题意,需要计算的是二人装车的重叠时间的总和是多少。以样例为例,二人分别在[2,3],[5,6]和[10,11]处同时装车,因此结果就是1+1+1=3。

对于该问题,可以建立一个统一的时间轴(用数组time来表示,time中所有元素初始化为0),数组的下标代表时刻(注意不是时间!。因此若要用这样的一个数组来正确地记录时间的信息,最好的方式就是将每一个输入的时间段当做左闭右开的区间来处理而不是题目中的闭区间。对于每一个输入的时间段[a,b],令time[a,b)的元素加1。这样,当所有数据处理完毕后,time中的元素每有一个等于2就说明存在一个单位时间是二人装车的重叠时间。此时只要再遍历一遍数组time统计2的个数即为所求结果。

具体代码如下:

#define N 1000010
#include <iostream>

using namespace std;

int time[N]; //存放时刻,不是时间

int main()
{
	int ans = 0;
	int n;
	cin >> n;
	for(int i = 0; i < 2 * n; i++) //输入并对time进行处理
	{
		int a, b;
		cin >> a >> b;
		for(int j = a; j < b; j++)
			time[j]++;
	}
	//根据测试数据的要求,这里可以从1开始进入循环
	for(int i = 1; i < N; i++) //统计time中的2的个数
	{
		if(time[i] == 2) ans++;
	}
	cout << ans;
	return 0;
}

另外,如果题目要求的是求二人聊天的次数(即装车时间重叠的段数),只需要将数组time中连续的2当作一个2来统计就可以了。 

猜你喜欢

转载自blog.csdn.net/Zee_Chao/article/details/87859361