问题一:

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 <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cstring>
 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];w
33     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

编程之美读书笔记之-高效率的安排见面会相关推荐

  1. 编程之美 - 读书笔记 - 卖书折扣问题的贪心解法

    <编程之美>读书笔记(四):卖书折扣问题的贪心解法 每 次看完<编程之美>中的问题,想要亲自演算一下或深入思考的时候,都觉得时间过得很快,动辄一两个小时,如果再把代码敲一遍的话 ...

  2. 【编程之美/读书笔记】Chapter 1 游戏之乐

    这里就不写每个问题的题目了,只是记录一下自己的总结和心得. 1.1 让CPU占用率听你指挥 这个题目我刚接触的想法是和多核多线程要扯上关系的,因为自己写个死循环只能跑到CPU 35%左右的占用率,但是 ...

  3. Java并发编程之美读书笔记-并发编程基础2

    2019独角兽企业重金招聘Python工程师标准>>> 1.线程的通知与等待 Java中的Object类是所有类的父亲,鉴于继承机制,Java把所有类都需要的方法放到了Object类 ...

  4. 编程之美读书笔记2.1—求二进制数中1的个数

    解法一: 可以举一个8位二进制的例子.对于二进制操纵,我们除以一个2,原来数字就会减少一个0(向右移一位).如果除的过程中有余,那么久表示当前位置有一个1. 以10100010为例: 第一次除以2时, ...

  5. 编程之美--读书笔记--返回一个数组中所有元素被第一个元素除的结果

    笔试题目1:写一个函数,返回一个数组中所有元素被第一个元素除的结果 很多人会想到如下: void DivAarry(int *pArray,int size) { for(int i=size-1;i ...

  6. 中国象棋将帅问题java_编程之美读书笔记1.2——中国象棋将帅问题

    http://blog.csdn.net/pipisorry/article/details/36380669 问题:下过中国象棋的朋友都知道,双方的"将"和"帅&quo ...

  7. 编程之美 - 读书笔记 - 烙饼问题与搜索树

    前 面已经写了一些关于烙饼问题的简单分析,但因为那天太累有些意犹未尽,今天再充实一些内容那这个问题研究透.我想,通过这篇文章,我们就可以把这一类问题 搞懂.再遇到优化问题,如果我们想不到别的办法,就可 ...

  8. 编程之美读书笔记_1.1_让CPU占用率曲线听你指挥

    题目:写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率.程序越精简越好,计算机语言不限.例如,可以实现下面三种情况:   1.    CPU的占用率固定在50 ...

  9. 设计模式之美读书笔记

    目录 设计模式之美 读书笔记5- 哪些代码看似面向对象,实际是面向过程编程? 读书笔记4- 封装.抽象.继承.多态分别解决了什么编程问题? 读书笔记3- 我们在讨论面向对象的时候,主要说的是什么? 读 ...

最新文章

  1. 优达学城《DeepLearning》项目1:预测每日自行车租赁客流量
  2. java异常——捕获异常+再次抛出异常与异常链
  3. maven学习(中)- 私服nexus搭建
  4. QTableWidgetble自定义表头排序设置
  5. 南信大计算机分类,南信大计算机原理样卷
  6. 研究阿里钉钉近三年,我们总结了10大企业级产品的营销套路
  7. 当美团遇上双11,给千亿医美市场带来更大想象空间
  8. Rsyslog 日志相关内容
  9. android rtc 不能写时间到 rtc 原因分析
  10. Project Euler 628: Open chess positions(公式)
  11. 解决在使用Java API操作HBase中出现的Could not locate executable null\bin\winutils.exe in the Hadoop binaries.错误
  12. 利用MATLAB进行shp文件转换并绘制断层线
  13. mysql中反单引号的作用_mysql中反单引号(`)作用
  14. postman全方位讲解(有空看下)
  15. java对txt记事本文件的读取与写入
  16. 阅读笔记-微表情心理学
  17. java 二维卡尔曼滤波_卡尔曼滤波 – Kalman Filtering
  18. 初步了解区块链技术落地——FISCO BCOS 快速搭建区块链
  19. 【沐风老师】3DMAX摆满我的书架(FillMyBookshelves)插件使用教程
  20. android 呼吸灯,十三种呼吸灯交互触控体验_手机_手机Android频道-中关村在线

热门文章

  1. Command 模式 Step by Step
  2. Android ListView的基本应用
  3. Excel 使用VBA 使表格的值被修改后填充颜色标注
  4. HTML5 canvas绘制雪花飘落动画(需求分析、知识点、程序编写分布详解)
  5. 参加2013中国大数据技术大会(BDTC2013)
  6. file标签样式修改
  7. 删除VisaulStudio2010产生的垃圾
  8. 写在开通博客的第一天
  9. 【Vue】class style:Vue中的两种样式处理方法
  10. JNI开发笔记(八)--Java读取txt文件进行JNI测试