ACM_程序设计竞赛:贪心算法:区间问题

  • 有n项工作,每项工作分别在 si 时间开始, ti 时间结束。对于每项工作你选择参与与否,如果选择 了参与,那么自始至终就必须全程参与。参与工作的时间段不可以重复。(开始的瞬间和结束重复也不可以)
    尽可能多的参与工作,可以参与多少。
/*
------------------------------------
[输入]
n=5, s={1,2,,4,6,8},t={3,5,7,9,10}
------------------------------------
[输出]
3(选择1,3,5)
-------------------------------------
[算法]
在可选的时间内,每次都选择结束时间最早的工作

*/

#include<iostream>
#include<algorithm>
using namespace std;

const int MAX_N=100000;
int N; //时间段数
int S[MAX_N],T[MAX_N];

pair<int,int> itv[MAX_N]; //用于工作排序的pair数组

bool cmp(const pair<int,int> &a,const pair<int,int> &b)   //输入性参数,不可改变
  {  return  a.first  <  b.first;  }  

void solve()
{
    //对pair字典序比较
    // 将T存入frist,S存入second
    for(int i=0;i<N;i++){
        itv[i].first=T[i];
        itv[i].second=S[i];
    }
    std::sort(itv,itv+N,cmp);

    //t是最后所选工作的结束时间
    int ans=0,t=0;
    for(int i=0;i<N;i++){
        if(t<itv[i].second){
            ans++;
            t=itv[i].first;
        }
    }

    cout<<ans<<endl;
}


int main(int ac,char* av[])
{
    while(cin>>N){
        for(int i=0;i<N;i++){
            cout<<"输入"<<i;
            cin>>S[i];
            cin>>T[i];
        }
        solve();
    }
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值