//求一个集合,这个集合与任意一个区间的交集,需至少有两个数字 //贪心过程:按n个区间的最右值从小到大对区间进行排列, //集合首先取第一个区间的最右两个数字, //到第二个区间,判断集合里的数有没有在区间里 //没有的话,就从第二个区间的最右开始往左取(cnt=0取最后两个数,cnt=1取最后一个数) #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; struct interval { int l,r; }a[10005]; bool cmp(interval a,interval b) { return a.r<b.r; } int main() { int n,res=0; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d %d",&a[i].l,&a[i].r); sort(a,a+n,cmp); vector<int> Set; Set.push_back(a[0].r-1); Set.push_back(a[0].r); res=2; for(int i=1;i<n;i++) { int cnt=0; for(int j=0;j<Set.size();j++) { if(Set[j]>=a[i].l&&Set[j]<=a[i].r) cnt++; } if(cnt==0) { Set.push_back(a[i].r-1); Set.push_back(a[i].r); res+=2; } else if(cnt==1) { Set.push_back(a[i].r); res++; } } printf("%d\n",res); return 0; }
时间: 2024-12-21 02:28:40