P2365 任务安排

题目描述

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

例如:S=1;T={1,3,4,2,1};F={3,2,3,3,4}。如果分组方案是{1,2}、{3}、{4,5},则完成时间分别为{5,5,10,14,14},费用C={15,10,30,42,56},总费用就是153。

输入输出格式

输入格式:

第一行是N(1<=N<=5000)。

第二行是S(0<=S<=50)。

下面N行每行有一对数,分别为Ti和Fi,均为不大于100的正整数,表示第i个任务单独完成所需的时间是Ti及其费用系数Fi。

输出格式:

一个数,最小的总费用。

输入输出样例

输入样例#1:

5

1

1 3

3 2

4 3

2 3

1 4

输出样例#1:

153

好吧又一道基础dp" role="presentation" style="position: relative;">dpdp,这题一看就是道水题。题中的s" role="presentation" style="position: relative;">ss在状态转移的时候有点烦,所以在状态转移的时候不如将s" role="presentation" style="position: relative;">ss的贡献和任务的时间和的贡献分开统计。然后来推推状态转移方程吧。

先令f[i]" role="presentation" style="position: relative;">f[i]f[i]完成前i" role="presentation" style="position: relative;">ii个任务所需的最少时间,并且我们在求f[i]" role="presentation" style="position: relative;">f[i]f[i]之前已经推出了f[1]…f[i−1]" role="presentation" style="position: relative;">f[1]…f[i−1]f[1]…f[i−1]的值,于是完成前i" role="presentation" style="position: relative;">ii个任务的方式就是先用之前求出的最优方式完成前j−1" role="presentation" style="position: relative;">j−1j−1个任务,然后将j…i" role="presentation" style="position: relative;">j…ij…i分成一批来处理。

接下来让我们用oi" role="presentation" style="position: relative;">oioi语言翻译上面一段话吧。当我们将j…i" role="presentation" style="position: relative;">j…ij…i分成一批来处理时,s" role="presentation" style="position: relative;">ss会对答案增加s∗j…n所有任务的费用之和" role="presentation" style="position: relative;">s∗j…n所有任务的费用之和s∗j…n所有任务的费用之和那么多的贡献,同样的,前i" role="presentation" style="position: relative;">ii个任务的完成时间会对答案增加前" role="presentation" style="position: relative;">前前i个任务的完成总时间∗j…i所有任务的费用之和" role="presentation" style="position: relative;">个任务的完成总时间∗j…i所有任务的费用之和个任务的完成总时间∗j…i所有任务的费用之和的贡献。所以状态转移方程就推出来了:

dp[i]=min(dp[i],dp[j−1]+s∗(w[n]−w[j−1])+tim[i]∗(w[i]−w[j−1]));" role="presentation" style="position: relative;">dp[i]=min(dp[i],dp[j−1]+s∗(w[n]−w[j−1])+tim[i]∗(w[i]−w[j−1]));dp[i]=min(dp[i],dp[j−1]+s∗(w[n]−w[j−1])+tim[i]∗(w[i]−w[j−1]));,其中tim[i]" role="presentation" style="position: relative;">tim[i]tim[i]和w[i]" role="presentation" style="position: relative;">w[i]w[i]都表示前缀和。

代码如下:

#include<bits/stdc++.h>
#define N 5005
using namespace std;
int n,s,dp[N],tim[N],w[N];
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
    return ans;
}
int main(){
    n=read(),s=read();
    memset(dp,0x3f3f3f3f,sizeof(dp));
    for(int i=1;i<=n;++i)tim[i]=tim[i-1]+read(),w[i]=w[i-1]+read();
    dp[0]=0;
    for(int i=1;i<=n;++i)for(int j=1;j<=i;++j)dp[i]=min(dp[i],dp[j-1]+s*(w[n]-w[j-1])+tim[i]*(w[i]-w[j-1]));
    printf("%d",dp[n]);
    return 0;
}

2018.07.09 洛谷P2365 任务安排(线性dp)的更多相关文章

  1. 洛谷 P2365 任务安排【dp】

    其实是可以斜率优化的但是没啥必要 设st为花费时间的前缀和,sf为Fi的前缀和,f[i]为分组到i的最小花费 然后枚举j转移,考虑每次转移都是把j到i分为一组这样意味着j及之后的都要增加s的时间,同时 ...

  2. 2018.11.04 洛谷P2679 子串(线性dp)

    传送门 为什么前几年的noipnoipnoip总是出这种送分题啊? 这个直接线性dpdpdp不就完了吗? f[i][j][k][0/1]f[i][j][k][0/1]f[i][j][k][0/1]表示 ...

  3. 2018.08.16 洛谷P2029 跳舞(线性dp)

    传送门 简单的线性dp" role="presentation" style="position: relative;">dpdp. 直接推一推 ...

  4. [洛谷P2365] 任务安排

    洛谷题目链接:任务安排 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时 ...

  5. 2018.07.01洛谷P2617 Dynamic Rankings(带修主席树)

    P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i ...

  6. 2018.07.17 洛谷P1368 工艺(最小表示法)

    传送门 好的一道最小表示法的裸板,感觉跑起来贼快(写博客时评测速度洛谷第二),这里简单讲讲最小表示法的实现. 首先我们将数组复制一遍接到原数组队尾,然后维护左右指针分别表示两个即将进行比较的字符串的头 ...

  7. 洛谷P2365 任务安排(斜率优化dp)

    传送门 思路: 最朴素的dp式子很好考虑:设\(dp(i,j)\)表示前\(i\)个任务,共\(j\)批的最小代价. 那么转移方程就有: \[ dp(i,j)=min\{dp(k,j-1)+(sumT ...

  8. 2018.11.09 洛谷P1110 [ZJOI2007]报表统计(multiset)

    传送门 sb题. 直接用两个multisetmultisetmultiset维护相邻两个数的差值和所有数的前驱后继. 插入一个数的时候更新一下就行了. 代码: #include<bits/std ...

  9. 2018.07.01 洛谷小B的询问(莫队)

    P2709 小B的询问 题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数 ...

随机推荐

  1. git-采集编码搜索

    https://github.com/search?utf8=%E2%9C%93&q=%E9%87%87%E9%9B%86%E7%BC%96%E7%A0%81&type= https: ...

  2. Java 跨域 CrossOrigin注解 Filter拦截 Nginx配置

    说明 资源请求的发起方与请求的资源不在同一个域中的: 一般的,只要网站的[协议名protocol].[主机host].[端口号port]这三个中的任意一个不同,网站间的数据请求与传输便构成了跨域调用: ...

  3. PCM 编码

    PCM编码,即无损编码(抽样->量化->编码) 这里的 无损 是个广义概念,任何数字编码都有损,只不过PCM的“损”最小:通常所说的无损编码都是指PCM编码 wav音频参数: 最重要的三个 ...

  4. SciTE: 中文字符支持问题

    SciTE: 中文字符支持问题   SciTE(Scintilla Text Editor)是一个体积小巧的文本编辑器. 但是它默认的设置对中文字符处理不好,其实只要对它进行相应的配置,就可以了. 1 ...

  5. zabbix出现中文不能选的情况

    像这里一样,有些选项是选不了的,这个时候我们要做的第一步就是,找到这个配置文件. 如果不知道在哪里的话可以用find命令查找. sudo find / -name locales.inc.php 找到 ...

  6. 视图的URL配置,找不到我设置的第一个Page

    问题:视图的URL配置,找不到我设置的第一个Page 我的代码如下: 结果访问/test/时说找不到这个page   原因:patterns方法的参数有两个,一个是prefix,一个是参数元祖,详见下 ...

  7. 亲, 我们来再重申一遍"=="和"equals的区别

    今天经历的一个事情太丢脸了, 一个学弟向我请教问题, 是这样的: 一个字符串里面含有空格, 不允许使用.trim()和replace方法, 只用if和for将空格去掉, 题目很简单, 一开始我是这样写 ...

  8. np.identity()

    二.np.identity()这个函数和之前的区别在于,这个只能创建方阵,也就是N=M 函数的原型:np.identity(n,dtype=None) 参数:n,int型表示的是输出的矩阵的行数和列数 ...

  9. oracle 使用正则表达式获取字符串中包含的数字

    select REGEXP_REPLACE('字符串中包含的数字123,提取后就是123', '[^0-9]', '') from dual;

  10. struts框架值栈问题二之值栈的内部结构

    2. 问题二 : 值栈的内部结构 ? * 值栈由两部分组成 > root -- Struts把动作和相关对象压入 ObjectStack 中--List > context -- Stru ...