【贪心】区间相交问题1910
题目描述
给定x 轴上n (n<1000)个闭区间。去掉尽可能少的闭区间,使剩下的闭区间都不相交。
给定n 个闭区间,编程计算去掉的最少闭区间数。
输入
第一行是正整数n,表示闭区间数。接下来的n行中,
每行有2 个整数,分别表示闭区间的2个端点。
输出
将计算出的去掉的最少闭区间数输出到文件inte.out。
样例输入
3 10 20 10 15 20 15
样例输出
2
思路:贪心算法,策略是在可选的区间中找右区间最快结束的,所以先对所有区间按右区间主要关键,左区间次要关键字升序排序。在从排序的结果依次遍历中找右区间最快结束呢
实现代码:
#include<bits/stdc++.h> using namespace std; const int maxn = 1002; int n; pair<int, int> itv[maxn]; bool cmp(pair<int,int> x,pair<int,int>y) { return x.second < y.second || (x.second == y.second && x.first < y.first); } int main() { cin >> n; int i,t = 0; for(i = 0; i < n; i++) { cin >> itv[i].first >> itv[i].second; itv[i].first = (int)abs(itv[i].first); //对区间绝对值,这应该是错误做法,有可能出现【-2,-1】,【1,2】这种区间,应该是两个不想交区间,但是绝对值之后变成一个不相交区间 itv[i].second = (int)abs(itv[i].second);//但是测试数据6都是负数区间,过不去暂时先应付,还未找到解决办法 if(itv[i].first > itv[i].second) { t = itv[i].first; itv[i].first = itv[i].second; itv[i].second = t; } } sort(itv,itv + n,cmp); int ans = 0; t = 0; for(i = 0; i < n; i++) { if(t < itv[i].first) { ans++; t = itv[i].second; } } cout << n - ans << endl; getchar(); getchar(); return 0; }

浙公网安备 33010602011771号