问题描述,给出N个开区间,选出尽可能多的开区间使其两两不相交,策略是选左端点尽可能大的点(或者右端点尽可能小的点)

    1. #include<cstdio>
    2. #include<algorithm>
    3. using namespace std;
    4. const int maxn = 110;
    5. struct Inteval{
    6. int x, y;
    7. }I[maxn];
    8. bool cmp (Inteval a, Interval b){
    9. if(a.x != b.x) return a.x > b.x;
    10. else return a.y < b.y;
    11. }
    12. int main(){
    13. int n;
    14. while(scanf("%d",&n)!=0){
    15. for(int i = 0; i < n; i++){
    16. scanf("%d %d",&I[i].x, &I[i].y);
    17. }
    18. sort(I, I + n, cmp);
    19. int ans = 1, lastX = I[0].x;
    20. for(int i = 1; i < n; i++){
    21. if(I[i].y <= lastX){
    22. lastX = I[i].x;
    23. ans++;
    24. }
    25. }
    26. printf("%d\n",ans);
    27. }
    28. return 0;
    29. }