CCF认证2018092-买菜

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

 根据题意,需要计算的是二人装车的重叠时间的总和是多少。以样例为例,二人分别在[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来统计就可以了。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值