题目:输入n行数,每行都有两个数分别是a,b代表一个a—b的区间,然后求出一个元素最少的集合,使这个集合与上面的n个集合的交集至少有两个元素的交集。
解题思路:先定义一个排序规则(终点大的在后面,若终点一样则起点大的在前面)把这些区间按这个规则排序,先取第一个区间的结尾两个元素,然后用这两个元素与下个区间的开头元素比较大小,如果这两个元素都大于下个区间开头元素,则下个区间不取元素,若其中一个小于开头元素,则将这个数更新为下个区间的最后一个元素,若这两个都小于开头元素,那么这两个元素更新为下个区间的两个元素。
细节处理:定义一个结构体存区间的起点和终点。
代码:#include<iostream>
#include<algorithm>
using namespace std;
struct A
{
int l,m;
}a[10001];
bool comp(A a,A b)
{
if(a.m!=b.m)
return a.m<b.m;
else return a.l>b.l;
}
int main()
{
int n,i,b,c,d,e,t;
while(cin>>n)
{
for(i=0;i<n;i++)
cin>>a[i].l>>a[i].m;
sort(a,a+n,comp);
b=a[0].m;
c=a[0].m-1;
e=2;
for(i=1;i<n;i++)
{
if(c>=a[i].l)
continue;
else if(b>=a[i].l&&c<a[i].l)
{
c=a[i].m;
e++;
}
else if(b<a[i].l&&c<a[i].l)
{
b=a[i].m;
c=a[i].m-1;
e+=2;
}
if(b<c)
{
t=b;
b=c;
c=t;
}
}
cout<<e<<endl;
}
return 0;
}
感想:贪心问题,每次都要考虑利益最大化。