博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ-1180 Batch Scheduling (分组求最优值+斜率优化)
阅读量:4609 次
发布时间:2019-06-09

本文共 1420 字,大约阅读时间需要 4 分钟。

题目大意:有n个任务,已知做每件任务所需的时间,并且每件任务都对应一个系数fi。现在,要将这n个任务分成若干个连续的组,每分成一个组的代价是完成这组任务所需的总时间加上一个常数S后再乘以这个区间的系数和。求最小代价。

题目分析:分组求最优值得问题。不过,这道题采用倒推可能要好做一些。定义状态dp(i)表示完成从第 i 个任务到第n个任务需要的最小代价,则状态转移方程为

dp(i)=min(dp(j)+(sumt(i)-sumt(j)+s)*sumf(i),很显然的要用斜率优化。

 

代码如下:

# include
# include
# include
# include
using namespace std;# define LL long longconst int INF=1<<30;const int N=10005;int n,m;int q[N];int t[N];int f[N];int dp[N];void read(int &x){ char ch=' '; while(ch<'0'||ch>'9') ch=getchar(); x=0; while(ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); }}void init(){ for(int i=0;i
=0;--i){ t[i]+=t[i+1]; f[i]+=f[i+1]; }}double getK(int i,int j){ return (double)(dp[i]-dp[j])/(double)(t[i]-t[j]);}int toDp(int i,int j){ return dp[j]+(t[i]-t[j]+m)*f[i];}int solve(){ int head=0,tail=-1; dp[n]=0; q[++tail]=n; for(int i=n-1;i>=0;--i){ while(head+1<=tail&&getK(q[head+1],q[head])<=(double)f[i]) ++head; dp[i]=toDp(i,q[head]); while(head+1<=tail&&getK(i,q[tail])<=getK(q[tail],q[tail-1])) --tail; q[++tail]=i; } return dp[0];}int main(){ while(~scanf("%d%d",&n,&m)) { init(); printf("%d\n",solve()); } return 0;}

  

转载于:https://www.cnblogs.com/20143605--pcx/p/5314617.html

你可能感兴趣的文章
监控级联时各个层的PoE交换机怎么选?
查看>>
存储过程
查看>>
ADO.NET--SqlConnection、SqlCommand的学习
查看>>
PCA降维处理
查看>>
random模块
查看>>
CSS3 新属性兼容性测试
查看>>
js闭包
查看>>
Oralce导入数据库出现某一列的值太大
查看>>
Union和Union All 的区别
查看>>
sql server 2005函数
查看>>
innotop
查看>>
jmeter 取样器--http请求详解
查看>>
【转载】Understanding the Objective-C Runtime
查看>>
aabb碰撞检测
查看>>
Xshell连接Linux
查看>>
20180530
查看>>
项目复审——Alpha阶段
查看>>
React Native Windows下环境安装(一)
查看>>
文本CSS
查看>>
JDK1.7新特性,语言篇
查看>>