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. jmeter随机函数

    有些接口的字段,入参须唯一. 高并发压测的时候,这个比较棘手,可以用多个随机函数组合 如:两个__RandomString中间,夹个__Random ${__RandomString(2,qwerty ...

  2. Json中相同或者重复记录的值相加组成新的Json

    var data = [ {"Networking": "WiFi", "count_value": "2000"}, ...

  3. js中使用cookie

    function setcookie(name, value, expires, path, domain, secure) { var cookieText = encodeURIComponent ...

  4. discuz 标签详解

    Discuz 模板标签说明 Discuz! 的模板采用近似 PHP 表达式的语法,基本都是可识别的HTML,但涉及到变量和动态内容时,基本形式下: <!-{ 代码内容 }-> 逻辑元素包围 ...

  5. AS3中String转换成Boolean

    AS3中, 对布尔值的转换, 规定所有的非空字符串都是true. 下面都不行: var f:Boolean = new Boolean(str); var f:Boolean = str as Boo ...

  6. Posting JSON to Spring MVC Controller

    Spring MVC can be setup to automatically bind incoming JSON string into a Java object. Firstly, ensu ...

  7. 在mfc中picture控件中显示Mat图片<转>

    void ShowMatImgToWnd(CWnd* pWnd, cv::Mat img) { if(img.empty()) return; CRect drect; pWnd->GetCli ...

  8. javascript中的二维数组

    要创建一个二位数组我们脑子里第一个出现的就是 var arr=[][]; 但是在javascript这样是会报错的,要在javascrip中创建一个二位数组对象方法如下 方法一     直接把数组写出 ...

  9. Mybatis-Generator自动生成Dao、Model、Mapping等相关映射文件(懒人版)

    今天在学习mybatis生成相关的映射文件的时候,发现了往期的生成Dao.Model.Mapping等文章多数都是一样的,我也在学着重复造轮子,不过是懒人造的.本文旨在解决开发过程,简化配置文件的“手 ...

  10. java内存模型:简单理解

    1.Java内存模型(Java Memory Model,JMM) 2.JMM定义了线程和主内存之间的抽象关系: 线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地 ...