首页 > 代码库 > CODEVS 2610活动选择
CODEVS 2610活动选择
2610 活动选择
题目描述 Description
假设有一个需要使用某一资源的n(n≤1000)个活动组成的集合S,S={1,…,n}。该资源一次只能被一个活动占有,每一个活动有一个开始时间bi和结束时间ei(bi≤ei)。若bi>ej或者bj>ei,则活动i和活动j兼容。
你的任务是是:选择由互相兼容的活动组成的最大集合。
输入描述 Input Description
共n+1行,其中第1行为n,第2行到第n+1行表示n个活动的开始时间和结束时间(中间用一个空格隔开),格式为:
n
b1 e1
…….
bn en
输出描述 Output Description
共有两行,第1行为满足要求的活动占用的时间t,第2行为最大集合中的活动序号,每个序号之间用一个空格隔开。
样例输入 Sample Input
11
3 5
1 4
12 14
8 12
0 6
8 11
6 10
5 7
3 8
5 9
2 13
样例输出 Sample Output
14
2 3 6 8
数据范围及提示 Data Size & Hint
数据范围不大,不用考虑。
这道题是个大坑,除非打表,否则不可能通过,因为测试数据粘上了其他题目的数据
正解:
1 #include <cstdio> 2 #include<iostream> 3 #include <algorithm> 4 using namespace std; 5 const int N=1e5+6; 6 struct activity{ 7 int start,end;//开始,结束时间 8 int xh;//记录序号 9 }a[N]; 10 int n,ans; 11 int act[1001];//记录选择的活动序号 12 int cmp(const activity &a,const activity &b) 13 { 14 return a.end<b.end; 15 } 16 int main() 17 { 18 cin>>n; 19 for(int i=1;i<=n;i++) 20 { 21 cin>>a[i].start>>a[i].end; 22 a[i].xh=i; 23 } 24 sort(a+1,a+n+1,cmp);//按结束时间进行从小到大排序 25 int cur=0,tot=0; 26 for(int i=1;i<=n;i++) 27 if(a[i].start>cur)//选择结束时间早的活动 28 { 29 cur=a[i].end; 30 ans+=a[i].end-a[i].start+1; 31 act[++tot]=a[i].xh; 32 } 33 cout<<ans<<endl; 34 sort(act+1,act+tot+1); 35 for(int i=1;i<=tot;i++) 36 cout<<act[i]<<" "; 37 return 0; 38 }
CODEVS 2610活动选择
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。