区间覆盖问题C++实现

区间覆盖问题C++实现

#include<iostream>
#include<algorithm>
using namespace std;

const int maxn = 20;

struct timetable
{
	int a;
	int b;
}time[maxn];

bool comp(timetable& x, timetable& y)//多看两遍 
{
	return (x.a < y.a);
}



int main()
{
	int i, j, N, n, count;
	int begin, end;
	while (cin >> N)//N表示有几组测试数据 
	{
		while (N--)
		{
			cin >> begin >> end;//需要覆盖线段的起点和终点
			cin >> n;//n个区间 
			for (i = 0; i < n; i++)
			{
				cin >> time[i].a;
				cin >> time[i].b;
				if (time[i].a > time[i].b) {
					int temp = time[i].a;
					time[i].a = time[i].b;
					time[i].b = temp;

				}
			}

			sort(time, time + n, comp);//区间按照a从小到大排序 

			count = 0;
			int len = 0, maxlen, tmp;
			int newbegin = begin;
			i = 0;
			while (len < end - begin)
			{
				maxlen = 0;
				for (i; i < n; i++)//找当前begin情况下最长 
				{
					if (time[i].a <= newbegin)
					{
						tmp = time[i].b - newbegin;
						if (tmp > maxlen)
						{
							maxlen = tmp;
							j = i;
						}
					}
					else
						break;
				}

				if (maxlen == 0)//说明断了,不存在连续覆盖 
				{
					cout << "no exit;";
					return 0;
				}

				cout << "(" << time[j].a << "," << time[j].b << ")" << "  ";
				len += maxlen;
				count++;
				newbegin = time[j].b;//新的起点

			}
			cout << endl << count << endl;
		}
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值