[AcWing303]任务安排2

有 \(N\) 个任务排成一个序列在一台机器上等待执行,它们的顺序不得改变。机器会把这 \(N\) 个任务分成若干批,每一批包含连续的若干个任务。从时刻 \(0\) 开始,任务被分批加工,执行第 \(i\) 个任务所需的时间是 \(t[i]\) 。另外,在每批任务开始前,机器需要 \(S\) 的启动时间,故执行一批任务所需的时间是启动时间 \(S\) 加上每个任务所需时间之和。一个任务执行后,将在机器中稍作等待,直至该批任务全部执行完毕。也就是说,同一批任务将在同一时刻完成。每个任务的费用是它的完成时刻乘以一个费用系数 \(c[i]\) 。请为机器规划一个分组方案,使得总费用最小。

\(1≤N≤3∗10^5\)

\(1≤S,Ti,Ci≤512\)

设 \(T[i]\) 为时间的前缀和 , \(C[i]\) 是系数 \(c\) 的前缀和 . 在一批任务开始对后续任务产生影响时,就先把费用累加到答案中. 这就是"费用提前计算"的思想 .

对于每一次转移, 有 \(chkmin(f[i], f[j] + (C[j] - C[i]) * T[i] + S * (C[n] - C[j]))\)

考虑到数据范围很像斜率优化 , 把式子转化为斜率优化的形式 :

\(f[j] = (S + T[i]) * C[j] - S * C[n] - T[i] * C[i] + f[i]\)

发现斜率是固定的 , 当截距最小时 \(f[i]\) 最小 . 所以要维护 \((C[j],f[j])\) 围成的下凸包 .

由于 \(f[j]\) 随 \(C[j]\) 单调递增 , \((S+T[i])\) 也是单调递增的 , 所以可以用单调队列维护 : 只保留两点间斜率 \(>=S+T[i]\) 的点 , 入队时检查有没有斜率递增

时间复杂度 \(O(n)\)

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #define debug(...) fprintf(stderr,__VA_ARGS__)
  6. #define Debug(x) cout<<#x<<"="<<x<<endl
  7. using namespace std;
  8. typedef long long LL;
  9. const int INF=1e9+7;
  10. inline LL read(){
  11. register LL x=0,f=1;register char c=getchar();
  12. while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
  13. while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
  14. return f*x;
  15. }
  16. const int N = 3e5 + 5;
  17. int T[N], C[N], q[N], f[N];
  18. int n, S;
  19. int main(){
  20. n = read(), S = read();
  21. for(int i = 1; i <= n; ++i){
  22. T[i] = T[i-1] + read();
  23. C[i] = C[i-1] + read();
  24. }
  25. int l = 1, r = 1;
  26. q[1] = 0; // 把0入队是因为j取0是合法的.
  27. for(int i = 1; i <= n; ++i){
  28. while(l < r && ((f[q[l+1]] - f[q[l]]) <= (S + T[i]) * (C[q[l+1]] - C[q[l]]))) l++;
  29. f[i] = f[q[l]] - (T[i] + S) * C[q[l]] + C[i] * T[i] + S * C[n];
  30. while(l < r && ((f[q[r]] - f[q[r-1]]) * (C[q[i]] - C[q[r]]) >= (f[q[i]] - f[q[r]]) * (C[q[r]] - C[q[r-1]]))) r--;
  31. q[++r] = i;
  32. }
  33. printf("%d\n", f[n]);
  34. }

[AcWing304]任务安排3

\(1≤N≤3∗10^5 ; 0≤S,c[i]≤512 ; -512≤t[i]≤512\)

完成的时间可以为负数 , 则 \(S+T[i]\) 不再具有单调性 . 所以在单调队列中二分查找出对应的位置 , 不需要出队 , 但需要维护入队时的斜率单调性

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #define debug(...) fprintf(stderr,__VA_ARGS__)
  6. #define Debug(x) cout<<#x<<"="<<x<<endl
  7. #define int long long
  8. using namespace std;
  9. typedef long long LL;
  10. const int INF=1e9+7;
  11. inline LL read(){
  12. register LL x=0,f=1;register char c=getchar();
  13. while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
  14. while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
  15. return f*x;
  16. }
  17. const int N = 3e5 + 5;
  18. int f[N], q[N], T[N], C[N];
  19. int n, S;
  20. inline int find(int L, int R, int x){
  21. while(L < R){
  22. int mid = (L + R) >> 1;
  23. if((f[q[mid+1]] - f[q[mid]]) <= x * (C[q[mid+1]] - C[q[mid]])) L = mid + 1; ///
  24. else R = mid;
  25. }
  26. return L;
  27. }
  28. signed main(){
  29. n = read(), S = read();
  30. for(int i = 1; i <= n; ++i){
  31. T[i] = T[i-1] + read();
  32. C[i] = C[i-1] + read();
  33. }
  34. int l = 1, r = 1;
  35. for(int i = 1; i <= n; ++i){
  36. int p = find(l, r, S + T[i]);
  37. f[i] = f[q[p]] - (S + T[i]) * C[q[p]] + S * C[n] + T[i] * C[i];
  38. while(l < r && ((f[q[r]] - f[q[r-1]]) * (C[i] - C[q[r]]) >= (f[i] - f[q[r]]) * (C[q[r]] - C[q[r-1]]))) r--;
  39. q[++r] = i;
  40. }
  41. printf("%lld\n", f[n]);
  42. }

[AcWing303/304]任务安排2/3的更多相关文章

  1. 51Nod 1428 活动安排问题

    51Nod   1428  活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...

  2. Beta版本冲刺计划及安排

    经过紧张的Alpha阶段,很多组已经从完全不熟悉语言和环境,到现在能够实现初步的功能.下一阶段即将加快编码进度,完成系统功能.强化软件工程的体会.Beta阶段的冲刺时间为期七天,安排在2016.12. ...

  3. C语言 活动安排问题之二

    有若干个活动,第i个开始时间和结束时间是[Si,fi),活动之间不能交叠,要把活动都安排完,至少需要几个教室? #include <stdio.h> #include <string ...

  4. C语言 活动安排问题

    有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? #include <stdio.h> #include <stdlib ...

  5. hdu 2037简单贪心--活动安排问题

    活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子.该问题要求高效地安排一系列争用某一公共资源的活动.贪心算法提供了一个简单.漂亮的方法使得尽可能多的活动 ...

  6. 项目安排(离散化+DP)

    题目来源:网易有道2013年校园招聘面试二面试题 题目描述: 小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的 ...

  7. 1Z0-053 争议题目解析304

    1Z0-053 争议题目解析304 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 304.What privileges must be granted to allow an a ...

  8. [HTTP Protocol] 200 OK (from cache)和304 Not Modified

    含义 200 OK (from cache)直接从缓存中获取的内容并未请求服务器 304 Not Modified 请求服务器并和服务器比较 If-Modified-Since,若文件未改变,服务器返 ...

  9. 扼杀 304,Cache-Control: immutable

    随着近些年社交网站的流行,越来越多的人学会了“刷”网页 ── 刷微博,刷朋友圈,刷新闻,刷秒杀页.这里的“刷”,就是刷新的意思,在浏览器里,你可以通过点击刷新按钮,或者用快捷键,或者移动端的下拉操作来 ...

随机推荐

  1. 使用Future、asyncio处理并发

    并发的意义 为了高效处理网络I/O,需要使用并发,因为网络有很高的延迟,所以为了不浪费CPU周期去等待,最好在收到网络响应之前做些其他的事. 在I/O密集型应用中,如果代码写得正确,那么不管是用哪种并 ...

  2. 蓝桥历年试题 DNA对比

    [编程题](满分27分) 脱氧核糖核酸即常说的DNA,是一类带有遗传信息的生物大分子.它由4种主要的脱氧核苷酸(dAMP.dGMP.dCMT和dTMP)通过磷酸二酯键连接而成.这4种核苷酸可以分别记为 ...

  3. Zabbix 数据库迁移

    背景:ZABBIX的环境是LNMP,MySQL的架构是M-M主备模式,单台服务器SSD硬盘800G.监控主机日渐增多,空间不足,迁移到同样架构下的SAS盘2T空间. 架构:A 192.168.0.10 ...

  4. 网络层中的 IP 协议

    IP协议 IP(IPv4.IPv6)相当于 OSI 参考模型中的第3层——网络层.网络层的主要作用是“实现终端节点之间的通信”.这种终端节点之间的通信也叫“点对点通信”. 网络的下一层——数据链路层的 ...

  5. shell练习1

    题目 把ls -l 的输出按照属主分类,打印每个属住的文件名 ls -l |sed -n '2,$p'| awk ' {hash[$]=hash[$]} END{ for (user in hash) ...

  6. MongoDB系列二:MongoDB安装过程

    一.MongoDB安装,以Linux系统安装为例:(下载:www.mongodb.org 注意使用stable版本) 1.下载最新版本的MongoDB安装包,wget http://fastdl.mo ...

  7. LeetCode 200. 岛屿的个数(Number of Islands)

    题目描述 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1 ...

  8. legend3---8、烦请节约时间

    legend3---8.烦请节约时间 一.总结 一句话总结: 时间不要浪费在垃圾情绪和无效社交上面. 1.商标不能以个人的名义注册? 可以先注册个体工商户,然后再可以注册商标 2.注册一个商标大概花多 ...

  9. ArcGIS Python 获得坐标

    import arcpy infc = arcpy.GetParameterAsText(0) # Identify the geometry field # desc = arcpy.Describ ...

  10. [MyBatis]完整MyBatis CRUD工程

    下载地址:https://files.cnblogs.com/files/xiandedanteng/Person191005.rar pom.xml:这个文件主要是引入依赖 <project ...