题目链接: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 :  

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std; const int maxn = 2e5;
int a[maxn], b[maxn]; int main()
{
int T, n, m, ti, query;
while (scanf("%d", &T) != EOF)
{
while (T--)
{
memset(a, , sizeof(a));
memset(b, , sizeof(b));
scanf("%d%d", &n, &m);
for (int i = ; i < n; i++)
{
scanf("%d", &ti);
a[ti] = ;
}
int len = ;
for (int i = ; i <= maxn; i++)
{
if (!a[i])
b[len++] = i; // 把空余时间存储起来
}
for (int i = ; i < m; i++)
{
scanf("%d", &query);
if (!a[query])
printf("%d\n", query);
else
{
int flag = ;
int l = , r = len-;
while (l <= r)
{
int mid = (l+r)/;
if (b[mid] == query)
{
printf("%d\n", b[mid]);
flag = ;
break;
}
else if (b[mid] < query)
l = mid+;
else if (b[mid] > query)
r = mid-;
}
if (!flag)
printf("%d\n", b[l]);
}
}
}
}
return ;
}

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

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

Exe  time :    

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std; const int maxn = 2e5;
int vis[maxn], b[maxn]; int main()
{
int T, n, m, t, q;
while (scanf("%d", &T) != EOF)
{
while (T--)
{
memset(vis, , sizeof(vis));
scanf("%d%d", &n, &m);
int maxi = ;
for (int i = ; i <= n; i++)
{
scanf("%d", &t);
maxi = max(maxi, t);
vis[t] = ;
}
int len = ;
for (int i = ; i <= maxi+; i++) // maxi+1表示n个任务中花费时间最长为maxi,假设遇到一个maxi/maxi+1的任务,那么这个任务执行时间就是maxi+1
{
if (!vis[i])
b[len++] = i;
}
while (m--)
{
scanf("%d", &q);
if (!vis[q])
printf("%d\n", q);
else
{
int l = , r = len-;
int flag = ;
while (l <= r)
{
int mid = (l+r)>>;
if (b[mid] == q)
{
flag = ;
printf("%d\n", b[mid]);
break;
}
else if (b[mid] > q)
r = mid-;
else if (b[mid] < q)
l = mid+;
}
if (!flag)
printf("%d\n", b[l]);
}
}
}
}
return ;
}

最新文章

  1. ubuntu安装
  2. servlet获取表单数据的方式和编码方式
  3. ssm+redis 如何更简洁的利用自定义注解+AOP实现redis缓存
  4. pip UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte
  5. ASP.NET MVC ValueProvider小结
  6. ASP------如何使界面布局具有一致外观
  7. CSS select样式列表-------美化列表
  8. BZOJ 4027 兔子与樱花
  9. JS 去除字符串中的空格
  10. Java之利用Socket获取网站内容
  11. 重写equal要重写 hashCode的原因
  12. 编程好帮手----CodeSmith Generator Studio
  13. Sping Boot入门到实战之入门篇(二):第一个Spring Boot应用
  14. ios 根据 schemes 打开 app
  15. AngularJS判断checkbox/复选框是否选中并实时显示
  16. 1_01 vue的双向绑定
  17. Delphi 10.3.1 Secure File Sharing解决应用间文件共享
  18. xbeePROS1发送的数据在802.15.4网络中有多大时延?
  19. python第五十一课——__slots
  20. notepad使用列选

热门文章

  1. commons-lang3工具类学习--------ObjectUtils
  2. this.class.getClassLoader().getResourceAsStream
  3. sqlserverinternals.com
  4. Unix domain socket
  5. 投资人王刚口述:滴滴如何用八十万成为百亿美金公司? zz
  6. Android View 绘制流程(Draw) 完全解析
  7. sql server 2008出现远程过程调用失败
  8. hql 时间
  9. odoo小数精确度
  10. Odoo10尝鲜:MRP 10 新概念