BestCoder3 1001 Task schedule(hdu 4907) 解题报告
2014-08-23 10:08
471 查看
题目链接: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 :
(2) 我的改良版本(其实不需要把maxn,也就是2e5 个所有空闲时间都存起来啦,只要把原来n个任务中最大的时间,再+1的那个时间存起来即可!!!)
所以maxi + 1 就是这个意思啦。
Exe time :
题目意思:给出工作表上的 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, 0, sizeof(a)); memset(b, 0, sizeof(b)); scanf("%d%d", &n, &m); for (int i = 0; i < n; i++) { scanf("%d", &ti); a[ti] = 1; } int len = 0; for (int i = 1; i <= maxn; i++) { if (!a[i]) b[len++] = i; // 把空余时间存储起来 } for (int i = 0; i < m; i++) { scanf("%d", &query); if (!a[query]) printf("%d\n", query); else { int flag = 0; int l = 0, r = len-1; while (l <= r) { int mid = (l+r)/2; if (b[mid] == query) { printf("%d\n", b[mid]); flag = 1; break; } else if (b[mid] < query) l = mid+1; else if (b[mid] > query) r = mid-1; } if (!flag) printf("%d\n", b[l]); } } } } return 0; }
(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, 0, sizeof(vis)); scanf("%d%d", &n, &m); int maxi = 1; for (int i = 1; i <= n; i++) { scanf("%d", &t); maxi = max(maxi, t); vis[t] = 1; } int len = 0; for (int i = 1; i <= maxi+1; 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 = 0, r = len-1; int flag = 0; while (l <= r) { int mid = (l+r)>>1; if (b[mid] == q) { flag = 1; printf("%d\n", b[mid]); break; } else if (b[mid] > q) r = mid-1; else if (b[mid] < q) l = mid+1; } if (!flag) printf("%d\n", b[l]); } } } } return 0; }
相关文章推荐
- BestCoder5 1001 Poor Hanamichi(hdu 4956) 解题报告
- BestCoder17 1001.Chessboard(hdu 5100) 解题报告
- BestCoder19 1001.Alexandra and Prime Numbers(hdu 5108) 解题报告
- BestCoder10 1001 Revenge of Fibonacci(hdu 5018) 解题报告
- BestCoder7 1002 Little Pony and Alohomora Part I(hdu 4986) 解题报告
- BestCoder3 1002 BestCoder Sequence(hdu 4908) 解题报告
- BestCoder18 1002.Math Problem(hdu 5105) 解题报告
- BestCoder13 1001.Beautiful Palindrome Number(hdu 5062) 解题报告
- BestCoder4 1002 Miaomiao's Geometry (hdu 4932) 解题报告
- [BestCoder] Round #3 1001、1002 | HDU 4907、4908
- BestCoder20 1002.lines (hdu 5124) 解题报告
- BestCoder8 1002 Revenge of Nim(hdu 4994) 解题报告
- BestCoder15 1002.Instruction(hdu 5083) 解题报告
- HDU BestCoder 1001
- hdu 4883 bestcoder round 2 1001 TIANKENG’s restaurant
- [BestCoder Round #25 1002]Harry And Magic Box 解题报告
- HDU 5104 Bestcoder #18 1001 Primes Problem 水题
- BestCoder10 1002 Revenge of GCD(hdu 5019) 解题报告
- BestCoder24 1001.Sum Sum Sum(hdu 5150) 解题报告
- BestCoder Round #3 1001 && HDU 4907 Task schedule (预处理)