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

来源:互联网 发布:php study教程 编辑:程序博客网 时间:2024/06/07 06:45
  • 有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 0