活动选择

简介: 活动选择学校在最近几天有n个活动,这些活动都需要使用学校的大礼堂,在同一时间,礼堂只能被一个活动使。由于有些活动时间上有冲突,学校办公室人员只好让一些活动放弃使用礼堂而使用其他教室。    现在给出n个活动使用礼堂的起始时间begini和结束时间endi(begini < endi),请你帮助办公室人员安排一些活动来使用礼堂,要求安排的活动尽量多。

活动选择
学校在最近几天有n个活动,这些活动都需要使用学校的大礼堂,在同一时间,礼堂只能被一个活动使。由于有些活动时间上有冲突,学校办公室人员只好让一些活动放弃使用礼堂而使用其他教室。   
现在给出n个活动使用礼堂的起始时间begini和结束时间endi(begini < endi),请你帮助办公室人员安排一些活动来使用礼堂,要求安排的活动尽量多。
【输入】 第一行一个整数n(n<=1000);  
接下来的n行,每行两个整数,第一个begini,第二个是endi(begini< endi <=32767)
【输出】 输出最多能安排的活动个数。
【样例输入】
  11
  3 5
  1 4
  12 14
  8 12
  0 6
  8 11
  6 10
  5 7
  3 8
  5 9
  2 13
【样例输出】
   4

分析:

• 算法模型:给n个开区间(begini,endi), 选择尽量多的区间, 使得两两不交。
• 做法: 首先按照end1<=end2<…<=endn的顺序排序,依次考虑各个活动, 如果没有和已经选择的活动冲突, 就选; 否则就不选。
• 正确性: 如果不选end1, 假设第一个选择的是endi,则如果endi和end1不交叉则多选一个end1更划算; 如果交叉则把endi换成end1不影响后续选择。

 

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 struct section
 4 {
 5     int id;
 6     int begin;
 7     int end;
 8     int flag;//是否被选中 
 9 };
10 int cmp(const void *a,const void *b);
11 int main()
12 {
13     freopen("act.in","r",stdin);
14     freopen("act.out","w",stdout);
15     struct section a[1005];
16     int n,i,lastEnd;
17     int count=0;
18     
19     scanf("%d",&n);
20     for(i=0;i<n;i++)
21     {
22         scanf("%d%d",&a[i].begin,&a[i].end);
23         a[i].id=i+1;
24         a[i].flag=0;
25     }
26     
27     qsort(a,n,sizeof(struct section),cmp);
28     
29     lastEnd=-1;
30     for(i=0;i<n;i++)
31     {
32         if(a[i].begin>=lastEnd) 
33         {
34             count++;
35             lastEnd=a[i].end;
36             a[i].flag=1;
37         }
38     }
39     /*
40     for(i=0;i<n;i++)
41     {
42         if(a[i].flag=1)
43             printf("%d\n",a[i].id);
44     }*/
45     
46     printf("%d\n",count);
47     return 0;
48 }
49 int cmp(const void *a,const void *b)
50 {
51     int ans= ((struct section *)a)->end -((struct section *)b)->end;
52     if(ans>0) return 1;
53     else if(ans<0) return -1;
54     else return 0;
55 }

 

相关文章
|
IDE Linux 开发工具
Linux 实操篇-Linux 磁盘分区、挂载
Linux 实操篇-Linux 磁盘分区、挂载
357 0
|
存储 固态存储 Linux
BLOCK 层这么多参数都是什么意思?!
每个 request queue 会维护一个 struct queue_limits 结构来描述对应的块设备的硬件参数,这些参数描述了硬件存储单元的组织方式,会影响 block layer 的很多行为,其中部分参数在 `/sys/block//queue/` 下导出 ```c struct request_queue { struct queue_limits limits; ... } `
4326 1
|
11月前
|
JavaScript 前端开发 索引
JavaScript获取url网址中域名后面的部分
如何截取 url 中网站域名之后的部分,需要用到以下几个方法:
281 3
|
12月前
|
Java 调度 Android开发
Android面试题之Kotlin中async 和 await实现并发的原理和面试总结
本文首发于公众号“AntDream”,详细解析了Kotlin协程中`async`与`await`的原理及其非阻塞特性,并提供了相关面试题及答案。协程作为轻量级线程,由Kotlin运行时库管理,`async`用于启动协程并返回`Deferred`对象,`await`则用于等待该对象完成并获取结果。文章还探讨了协程与传统线程的区别,并展示了如何取消协程任务及正确释放资源。
264 0
|
11月前
|
索引 Python
Pandas 数据结构 - Series
10月更文挑战第26天
142 2
Pandas 数据结构 - Series
产品入门第六讲:Axure中继器
产品入门第六讲:Axure中继器
257 0
|
机器学习/深度学习 计算机视觉
深度学习第6天:ResNet深度残差网络
深度学习第6天:ResNet深度残差网络
|
Java Maven
关于maven标签产生content type is element-only问题解决方案
这是一个简单的小问题,日常使用maven的时候不注意容易犯的一个错误
1385 0
关于maven标签产生content type is element-only问题解决方案
|
关系型数据库 PostgreSQL
gitlab占用内存太大了如何解决?
gitlab占用内存太大了如何解决?
使用ffmpeg拼接两张图片
最近在工作中遇到了一个需求,就是需要将两张图片拼接在一起,作为一个封面图。如果只是临时拼接一张,我们可以只用photoshop之类的图片编辑工具,将两张图片拼接在一起。而我们的需要是需要实现自动化,由于之前使用过ffmpeg做过图片的操作,于是搜索了下,ffmpeg确实能实现两张图片的拼接,这里分享下相关操作的命令行。
298 0