Week3 作业 C - 区间覆盖 POJ - 2376

描述

数轴上有 n (1<=n<=25000)个闭区间 [ai, bi],选择尽量少的区间覆盖一条指定线段 [1, t]( 1<=t<=1,000,000)。
覆盖整点,即(1,2)+(3,4)可以覆盖(1,4)。
不可能办到输出-1

输入

   第一行:N和T
   第二行至N+1行: 每一行一个闭区间。

输出

选择的区间的数目,不可能办到输出-1

样例输入

3 10
1 7
3 6
6 10

样例输出

2

提示

   这道题输入数据很多,请用scanf而不是cin
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <list>
#include<stdio.h>
using namespace std;
struct line {
	int pa;
	int pb;
	line(int s, int e) :pa(s), pb(e) {
	}
	bool operator<(const line& l2) {
		if (pa != l2.pa) {
			return pa < l2.pa;
		}
		return pb > l2.pb;
	}
};


int main(int argc, char** argv) {
	list<line> lines;
	int n, t;
	cin >> n >> t;
	for (int i = 0; i < n; i++) {
		int a, b;
		scanf("%d%d", &a, &b);
		if (b < a) swap(a, b);
		if (a > t)continue;
		line newline(a, b);
		lines.push_back(newline);
	}
	lines.sort();
	int cmin = 0, cmax = 0, nmin = 0, nmax = 0, ca = 0, cb = 0, point = 0;
	for (list<line>::iterator it = lines.begin(); it != lines.end(); it++) {
		ca = it->pa; cb = it->pb;

		if (ca > cmin) { //skip to next line
			if (ca > cmax + 1) { //no result
				cout << -1 << endl;
				return 0;
			}
			cmin = cmax + 1;
			cmax = cb;
			point++;
			if (cmax >= t) break;
			continue;

		}
		else {
			if (cb > cmax) cmax = cb; //if can expand
			if (cmax >= t) break;
		}
	}
	if (cmax < t) {
		cout << -1 << endl;
		return 0;
	}
	cout << point << endl;

}
发布了16 篇原创文章 · 获赞 2 · 访问量 305

猜你喜欢

转载自blog.csdn.net/ziseon/article/details/104812200