贪心训练题

区间贪心
给定一系列的区间,让你进行安排;
本题给定一系列区间,求最多的独立区间数,先用pair或者struct进行储存,然后自定义sort对区间有右端点进行排序
然后int t=0,t与前端点进行比较,小于等于前端点则为独立区间,t变成当前点的右端点

解释:
对结束时间排序的原因是因为,把最早结束的必须安排,如果后面出现于最早结束时间相重
合,那可以不管后面的那个
比如
1 4和2 4
明显第二个时间短,但选第一个和第二个都一样
如果有结束时间更短的,那么第一个就是更短的那个。

但如果需要保障时间最长的话,那就需要其他条件了,这个只是求出最长独立区间个数

4
1 3
4 6
2 5
1 7

排序

1 3
2 5
4 6
1 7
然后t=0;
开始遍历,
t<=1,则ans=1,t=3;
t>2,则不管第二个数
t<=4,ans=2,t=6
t>1,则不管第四个数

A题和H题

题目链接:
https://ac.nowcoder.com/acm/contest/950/A
https://ac.nowcoder.com/acm/contest/950/H

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1005;

bool cmp(pair<int,int>a,pair<int,int>b){
    return a.second < b.second;
}
int main(){
    int n;
    while(scanf("%d",&n)!=EOF&&n){
        pair<int,int>g[maxn];
        for(int i=0;i<n;i++){
            scanf("%d%d",&g[i].first,&g[i].second);
        }
        sort(g,g+n,cmp);//对pair的排序,默认是对first排序

        int t=0,ans=0;
        for(int i=0;i<n;i++){
            if(g[i].first>=t){
                t=g[i].second;
                ans++;
            }
        }
        
        printf("%d\n",ans);


    }

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Emcikem/p/11333807.html