首页 > 其他 > 详细

简单区间问题

时间:2020-01-16 16:21:30      阅读:90      评论:0      收藏:0      [点我收藏+]

问题描述:有n项工作,每项工作分别在si时间开始,在ti时间结束。你的目标是参与尽可能多的工作,那么最多能参与多少项工作?

(限制条件:1≤N≤100000    1≤si≤ti≤10^9)

样例

输入:n=5,s={1,2,4,6,8},t={3,5,7,9,10}

输出:3

 分析:一般会有下列几种想法:

(1)在可选的工作中,每次都选取开始时间最早的工作。

 

(2)在可选的工作中,每次都选取结束时间最早的工作。

 

(3)在可选的工作中,每次都选取用时最短的工作。

 

(4)在可选的工作中,每次都选取与最少可选工作有重叠的工作。

算法(2)是正确的,其余的在某些情况下,它们所取的工作并非最优。如对(3):输入n=3,s={1,3,5},t={4,6,9},最优解应为2(选1-4  5-9这两段),但(3)的答案为1,会选3-6。

算法(2)代码如下:

 1 #include<iostream>
 2 #include<algorithm> 
 3 using namespace std;
 4 
 5 const int MAX_N=100000;
 6 
 7 int N,S[MAX_N],T[MAX_N];
 8 pair<int,int> itv[MAX_N];//工作区间 
 9 
10 int main()
11 {
12     cin>>N;
13     for(int i=0; i<N; i++){
14         cin>>S[i];
15     }
16     for(int i=0; i<N; i++){
17         cin>>T[i];
18     }
19     
20     for(int i=0; i<N; i++){
21         itv[i].first=T[i];//为了让结束时间早的工作排在前面,把T存入first
22         itv[i].second=S[i];//,S存入second(总之是为了下面排序的方便)
23     }
24     sort(itv,itv+N);
25     
26     int ans=0,t=0;
27     for(int i=0; i<N; i++){
28         if(t<itv[i].second){//上一件工作结束时间<上一件工作开始时间 
29             ans++;
30             t=itv[i].first;
31         }
32     } 
33     cout<<ans;
34     return 0;
35 }

简单区间问题

原文:https://www.cnblogs.com/Si-wuxie/p/12201764.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!