题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4907

题目意思:给出工作表上的 n 个任务,第 i 个任务需要 ti 这么长的时间(持续时间是ti ~ ti+1)来完成。有m 个询问,每个询问是一个数字q,表示q 时间上有一个非 n 个任务之外的任务请求。机器是按照工作表的任务时间来执行的,如果有空档时间,它会执行工作表之外的任务请求。

直接做,果断超时!1e5 * 2e5 !!!(m次询问+q次遍历 的最坏情况)

二分解决之~~~~一开始我不是只存储空闲时间啦,我还把工作表上要处理的n 个任务的时间都存在一起,导致写的二分不三不四啊~~~~= =

二分思想其实好容易理解,真正运用起来还是第一次啊~~~好好纪念纪念 ^_^

(1)这个是参考别人的,不过时间稍微用得有点多

Exe time :  

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. using namespace std;
  6.  
  7. const int maxn = 2e5;
  8. int a[maxn], b[maxn];
  9.  
  10. int main()
  11. {
  12. int T, n, m, ti, query;
  13. while (scanf("%d", &T) != EOF)
  14. {
  15. while (T--)
  16. {
  17. memset(a, , sizeof(a));
  18. memset(b, , sizeof(b));
  19. scanf("%d%d", &n, &m);
  20. for (int i = ; i < n; i++)
  21. {
  22. scanf("%d", &ti);
  23. a[ti] = ;
  24. }
  25. int len = ;
  26. for (int i = ; i <= maxn; i++)
  27. {
  28. if (!a[i])
  29. b[len++] = i; // 把空余时间存储起来
  30. }
  31. for (int i = ; i < m; i++)
  32. {
  33. scanf("%d", &query);
  34. if (!a[query])
  35. printf("%d\n", query);
  36. else
  37. {
  38. int flag = ;
  39. int l = , r = len-;
  40. while (l <= r)
  41. {
  42. int mid = (l+r)/;
  43. if (b[mid] == query)
  44. {
  45. printf("%d\n", b[mid]);
  46. flag = ;
  47. break;
  48. }
  49. else if (b[mid] < query)
  50. l = mid+;
  51. else if (b[mid] > query)
  52. r = mid-;
  53. }
  54. if (!flag)
  55. printf("%d\n", b[l]);
  56. }
  57. }
  58. }
  59. }
  60. return ;
  61. }

(2) 我的改良版本(其实不需要把maxn,也就是2e5 个所有空闲时间都存起来啦,只要把原来n个任务中最大的时间,再+1的那个时间存起来即可!!!)

所以maxi + 1 就是这个意思啦。

Exe  time :    

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. using namespace std;
  6.  
  7. const int maxn = 2e5;
  8. int vis[maxn], b[maxn];
  9.  
  10. int main()
  11. {
  12. int T, n, m, t, q;
  13. while (scanf("%d", &T) != EOF)
  14. {
  15. while (T--)
  16. {
  17. memset(vis, , sizeof(vis));
  18. scanf("%d%d", &n, &m);
  19. int maxi = ;
  20. for (int i = ; i <= n; i++)
  21. {
  22. scanf("%d", &t);
  23. maxi = max(maxi, t);
  24. vis[t] = ;
  25. }
  26. int len = ;
  27. for (int i = ; i <= maxi+; i++) // maxi+1表示n个任务中花费时间最长为maxi,假设遇到一个maxi/maxi+1的任务,那么这个任务执行时间就是maxi+1
  28. {
  29. if (!vis[i])
  30. b[len++] = i;
  31. }
  32. while (m--)
  33. {
  34. scanf("%d", &q);
  35. if (!vis[q])
  36. printf("%d\n", q);
  37. else
  38. {
  39. int l = , r = len-;
  40. int flag = ;
  41. while (l <= r)
  42. {
  43. int mid = (l+r)>>;
  44. if (b[mid] == q)
  45. {
  46. flag = ;
  47. printf("%d\n", b[mid]);
  48. break;
  49. }
  50. else if (b[mid] > q)
  51. r = mid-;
  52. else if (b[mid] < q)
  53. l = mid+;
  54. }
  55. if (!flag)
  56. printf("%d\n", b[l]);
  57. }
  58. }
  59. }
  60. }
  61. return ;
  62. }

BestCoder3 1001 Task schedule(hdu 4907) 解题报告的更多相关文章

  1. BestCoder12 1001.So easy(hdu 5058) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5058 (格式有点问题,为了方便阅读---整个复制下来吧) 题目意思:给出两个长度都为 n 的集合你,问 ...

  2. BestCoder3 1002 BestCoder Sequence(hdu 4908) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4908 题目意思:给出 一个从1~N 的排列你和指定这个排列中的一个中位数m,从这个排列中找出长度为奇数 ...

  3. BestCoder5 1001 Poor Hanamichi(hdu 4956) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4956(它放在题库后面的格式有一点点问题啦,所以就把它粘下来,方便读者观看) 题目意思:给出一个范围 [ ...

  4. "1001. A+B Format (20)" 解题报告

    Github : git@github.com:Circlecos/object-oriented.git PDF Of Markdown : "1001. A+B Format (20)& ...

  5. BestCoder8 1001.Summary(hdu 4989) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4989 题目意思:给出 n 个数,然后将这些数两两相加,得到 n*(n-1) /2 对和,把重复的和去掉 ...

  6. BestCoder24 1001.Sum Sum Sum(hdu 5150) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5150 题目意思:就是直接求素数. 不过 n = 1,也属于答案范围!!只能说,一失足成千古恨啊---- ...

  7. BestCoder19 1001.Alexandra and Prime Numbers(hdu 5108) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5108 题目意思:给出一个数正整数 N,N <= 1e9,现在需要找出一个最少的正整数 M,使得 ...

  8. BestCoder17 1001.Chessboard(hdu 5100) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5100 题目意思:有一个 n * n 的棋盘,需要用 k * 1 的瓷砖去覆盖,问最大覆盖面积是多少. ...

  9. BestCoder13 1001.Beautiful Palindrome Number(hdu 5062) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5062 题目意思:给出 N,找出 1 - 10^N 中满足 Beautiful Palindrome N ...

随机推荐

  1. 项目心得——按照指定的日期/时间创建Date对象

    项目心得——按照指定的日期/时间创建Date对象 有时,在做项目中,需要获得指定日期的Date对象,这个指定的日期或者时间可能不是当前的时间.下面讲解两种获取指定日期/时间的Date对象的方法: pa ...

  2. Java开发笔记(一百零二)信号量的请求与释放

    前面介绍了同步与加锁两种并发处理机制,虽然加锁比起同步要灵活一些,但是加锁在某些高级场合依然力有未逮,包括但不限于下列几点:1.某块代码被加锁之后,对其它线程而言就处于繁忙状态,缺乏弹性的阈值范围:2 ...

  3. 四个很好的开源app项目

    Open Source and the iOS App Store Today, we are open-sourcing 4 iOS apps: ThatInbox, an email client ...

  4. 3D空间中射线与轴向包围盒AABB的交叉检测算法 【转】

    http://blog.csdn.net/i_dovelemon/article/details/38342739 引言 在上一节中,我讲述了如何实现射线与三角形的交叉检测算法. 但是,我们应该知道, ...

  5. gvim的常用编辑快捷键

    gvim的快捷键很多,很难记全,但是入门初期应该找过几种基本的命令 下面结合自己常用到的介绍下 光标跳转: 0:行首 $:行尾 e:下一个单词的结尾 w:下一个单词的开头 b:上一个单词 H:当前页面 ...

  6. Neural Networks for Machine Learning by Geoffrey Hinton (1~2)

    机器学习能良好解决的问题 识别模式 识别异常 预測 大脑工作模式 人类有个神经元,每一个包括个权重,带宽要远好于工作站. 神经元的不同类型 Linear (线性)神经元  Binary thresho ...

  7. Hadoop 50090端口的页面, Replication的数字是真实的文件备份数吗? (不是)

    红色方框的部分,代表Hadoop系统,人工设定的文件备份数,但不是实际的备份数.文件备份数 不会大于集群机器的总数目(因为备份文件不会同时存在一台机器上,这样就没有意义),所以如果总集群数目是2,即使 ...

  8. ASP.NET MVC模式——WebPages

    WebPages 示例 123456<html> <body> <h1>Hello Web Pages</h1> <p>The time i ...

  9. Java链接MySql数据库(转)

    import java.sql.*; public class JDBCTest { public static void main(String[] args){ // 驱动程序名 String d ...

  10. Android 向右滑动销毁(finish)Activity, 随着手势的滑动而滑动的效果

    http://blog.csdn.net/xiaanming/article/details/20934541