博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程之美读书笔记之-高效率的安排见面会
阅读量:4652 次
发布时间:2019-06-09

本文共 2295 字,大约阅读时间需要 7 分钟。

问题一:

n个同学,分别对m个招聘见面会感兴趣。为了满足所有学生的要求,hr希望让每个同学都能参加自己所有感兴趣的见面会。然后每个见面会的时间为t。问如何安排见面会能够使得所有见面会总的时间最短。

建图,以m场见面会为节点,然后,对于每一个同学,如果它同时对A和B见面会感兴趣,那么,我们在A和B见面会之间添加一条边。要使得所有见面会总的时间最短,可以把所有的见面会分成若干的集合,规定,每个集合里面不能存这样两个见面会A和B,存在一个同学同时对A和B感兴趣。这样,一个集合的见面会是不是就可以同时进行了。

最后,我们发现,这不就是著名的NP问题之一的最少着色问题吗。还可以联想到并行处理器装载作业的问题啊,同时执行的任意两个作业不能需要同一个资源。这些类似的问题。不过,除了O((n-1)^n*n^2)的能够得到确定解的算法,据说还没有这个问题的有效算法,所以这里不予以讨论。

 

扩展问题一:

见面会之后,正式面试就陆续开始了。一共有N场面试,每场面试的时间是(B[i], E[i]),假设一个面试者一天只参加一场面试,为了使面试者能够发挥最佳状态,hr希望同时进行的面试可以安排在不同的地方。那么问题来了,最多需要多少个面试场所。

一组测试数据

A[1,5]

B[2,3]

C[3,4]

D[3,6]

如下图所示:

用通俗的话来说,通过这张图,我们可以很清晰的看到,某个区间包含的直线最多,直线的条数其实就是需要的最少的面试点。

用数学语言来说,把所有的面试时间划分成长度为1的小区间,另一维坐标轴上的每个单位区间初始的权值为0,现在把所有面试划分的小区间分别插入到对应的区间,每插入一个,对应的区间权值加1,所有区间中,权值最高的区间就是同时在进行面试的场次最多的时候,也就是需要的面试点的最少数目。

我的解法是:用树状数组维护区间信息,对于每一个面试区间(B[i], E[i]),把这个区间权值+1,最后,遍历每一个单位区间,找出权值最大的区间,这个权值就是需要的最少的面试点。

 用树状数组维护区间的一般方法,例如要给区间(B[i], E[i])进行+1操作,需要分为两步,第一步在B[i]这个位置+1操作,然后在E[i]这个位置-1操作,这样的话E[i]后面的就会被抵消,不会受到这次操作的影响,然后可以查询单点的信息,就是求这个点到0的和,下面给一个我的代码:

1 #include 
2 #include
3 #include
4 #include
5 using namespace std; 6 const int maxn = 1e5 + 5; 7 struct node 8 { 9 int s,e;10 }List[maxn];11 int tree[maxn];12 13 int lowbit(int x)14 {15 return x & (-x);16 }17 /*18 单点插入操作 19 */20 void insert(int* A, int l, int d) 21 {22 for(int i = l;i < maxn;i += lowbit(i))23 A[i] += d;24 }25 /*26 单点查询操作 27 */28 int query(int* A, int l)29 {30 int tot = 0;31 for(int i = l;i >= 1;i -= lowbit(i))32 tot += A[i];w33 return tot;34 }35 int main()36 {37 // freopen("in.txt", "r", stdin);38 int n; //n为区间个数 39 while(scanf("%d", &n)!=EOF)40 {41 int ans = 0;42 memset(tree, 0, sizeof(tree));43 int x, y, lmin = 0x7fffffff, lmax = 0;44 for(int i = 0;i < n;i++)45 {46 scanf("%d%d", &x, &y);47 lmin = min(lmin, x); //获取所有区间的并集,减少不必要的遍历 48 lmax = max(lmax, y);49 insert(tree, x, 1);50 insert(tree, y, -1);51 }52 for(int i = lmin;i <= lmax;i++)53 ans = max(ans, query(tree, i));54 printf("%d\n", ans);55 }56 return 0;57 }
View Code

 

转载于:https://www.cnblogs.com/xiaxiaosheng/p/4756856.html

你可能感兴趣的文章
spring Boot 入门--为什么用spring boot
查看>>
负载均衡
查看>>
tar and war的一些命令
查看>>
BZOJ 1260&UVa 4394 区间DP
查看>>
CentOS或Redhat上装memcached (包括64位系统)
查看>>
C 字符串数组排序
查看>>
ios开发学习--列表(Table)效果源码分享--系列教程4
查看>>
Modified判断Tedit TMemo类型的文件是否修改过
查看>>
python基础-对象
查看>>
如何使函数不生成执行代码
查看>>
MySQL 数据库设计 笔记与总结(3)物理设计
查看>>
第5周团队作业1:项目建议
查看>>
抠图划线
查看>>
HDU 4897 Little Devil I(树链剖分)(2014 Multi-University Training Contest 4)
查看>>
jmeter 参数化学习笔记
查看>>
Convert the AScii to SAC file
查看>>
PAT (Basic Level) Practise 1002. 写出这个数
查看>>
SxsTrace
查看>>
How to correctly use preventDefault(), stopPropagation(), or return false; on events
查看>>
How to: Update an .edmx File when the Database Changes
查看>>