当前位置: 首页 > news >正文

Poj1180 Batch Scheduling --- DP的斜率优化

题意

N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务。从时刻0开始,这些任务被分批加工,第i 个任务单独完成所需的时间是Ti。在每批任务开始前,机器需要启动时间S,而完成这批任务所需的时间是各个任务需要时间的总和(同一批任务将在同一时刻完 成)。每个任务的费用是它的完成时刻乘以一个费用系数Fi。请确定一个分组方案,使得总费用最小。

算法讨论

毫无疑问DP.转移方程:dp[i]=Min{dp[j]+(sumF[i]-sumF[j])*sumT[i]+s*(sumF[N]-sumF[j])},其中dp[i]表示的是完成1~i的工作的花费+因为开机启动时间所浪费的后面的花费。

但是这个转移方程的复杂度是O(N^2)的,如果RP好的话可以试试~但是显然,我们有更强大的方法:斜率优化。

至于什么是斜率优化……可以百度一下“斜率优化”……

只说说这道题的证明:

设G[i,j]表示dp[i]的决策为j时的dp[i]值。

设j1<j2,且G[i,j1]<G[i,j2](即以j1为决策时优于j2)

G[i,j1]=dp[j1]-sumF[j1]*sumT[i]-s*sumF[j1]+s*sumF[N]+sumF[i]*sumT[i]

G[i,j2]=dp[j2]-sumF[j2]*sumT[i]-s*sumF[j2]+s*sumF[N]+sumF[i]*sumT[i]

G[i,j1]-G[i,j2]=(dp[j1]-s*sumF[j1])-(dp[j2]-s*sumF[j2])-sumT[i]*(sumF[j1]-sumF[j2])<0

整理得

【(dp[j1]-s*sumF[j1])-(dp[j2]-s*sumF[j2])】

---------------------------------------------------------------------     > sumT[i]

    (sumF[j1]-sumF[j2])

又因为sumT[i]单调不降

所以最优决策单调

那么维护一个队列就可以了。

参考代码:

# include <iostream>
# include <cstdio>
# include <cmath>
using namespace std;
const int maxN=10005;
long long dp[maxN],f[maxN],t[maxN],N,s;
long long calc(int,int);
int slope(int,int,int);

int main()
{
	int seq[maxN],fi,ti,l=1,r=1;
	seq[1]=0;
	scanf("%lld",&N);scanf("%lld",&s);
	for (int i=1;i<=N;i++){
		scanf("%d%d",&ti,&fi);t[i]=t[i-1]+ti;f[i]=f[i-1]+fi;
	}
	for (int i=1;i<=N;i++){
		while ((l<r)&&(calc(i,seq[l])>calc(i,seq[l+1]))) l++;
		dp[i]=calc(i,seq[l]);
		while ((l<r)&&(slope(seq[r],seq[r-1],i))) r--;
		seq[++r]=i;
	}
	printf("%lld\n",dp[N]);
	return 0;
}

long long calc(int i,int j)
{
	return dp[j]+(f[i]-f[j])*t[i]+s*(f[N]-f[j]);
}

int slope(int i,int j,int k)
{
	long long imj=((dp[k]-s*f[k])-(dp[i]-s*f[i]))*(f[k]-f[j]);
	long long jmi=((dp[k]-s*f[k])-(dp[j]-s*f[j]))*(f[k]-f[i]);
	return imj<jmi;
}

 



转载于:https://www.cnblogs.com/Thispoet/archive/2011/11/30/2268967.html

相关文章:

  • 把成熟的代码从.NET移植到Mono 【转】
  • 使用rsync+inotify做双机实时互备
  • Xen Desktop测试报告
  • 减速机行业“十二五”标准化战略
  • 超声(PDUS)能否容易检出侵蚀?比较PDUS与microCT对正常人群和RA患者小关节生理和皮质断裂的评价...
  • [原创]一些Ubuntu的代理设置
  • Active Directory系列之七:Active Directory的脱机碎片整理
  • 分析师:苹果第4季度将销售3000万部iPhone
  • Boost asio 心得笔记
  • 我的2011
  • 如何与非同盟组织分享日历
  • IE与IE内核浏览器的那点事
  • Chrome 15 超越 IE8
  • 一个学姐对CCIE考生的忠告
  • 腾讯微博等7家网站实行实名制
  • 「面试题」如何实现一个圣杯布局?
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 2019.2.20 c++ 知识梳理
  • angular学习第一篇-----环境搭建
  • bearychat的java client
  • Date型的使用
  • Java面向对象及其三大特征
  • LeetCode18.四数之和 JavaScript
  • Mac转Windows的拯救指南
  • Quartz初级教程
  • 初识 webpack
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 基于HAProxy的高性能缓存服务器nuster
  • 聊一聊前端的监控
  • 免费小说阅读小程序
  • 强力优化Rancher k8s中国区的使用体验
  • 使用Gradle第一次构建Java程序
  • 说说动画卡顿的解决方案
  • 算法-图和图算法
  • 通过几道题目学习二叉搜索树
  • 网页视频流m3u8/ts视频下载
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 译米田引理
  • 智能合约开发环境搭建及Hello World合约
  • 【云吞铺子】性能抖动剖析(二)
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • MPAndroidChart 教程:Y轴 YAxis
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • #14vue3生成表单并跳转到外部地址的方式
  • #QT(智能家居界面-界面切换)
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (剑指Offer)面试题34:丑数
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)大型网站的系统架构