您的位置:首页 > 其它

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

2016-04-12 01:34 706 查看
有n项工作,每项工作分别在 sis_i时间开始,tit_i时间结束。对于每项工作你选择参与与否,如果选择 了参与,那么自始至终就必须全程参与。参与工作的时间段不可以重复。(开始的瞬间和结束重复也不可以)

尽可能多的参与工作,可以参与多少。

/*
------------------------------------
[输入]
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: