zoukankan      html  css  js  c++  java
  • 【3-2】最优批处理问题

    问题描述:
    在一台超级计算机上,编号为1,2, ,  n 的 n 个作业等待批处理。批处理的任务就是将
    这 n 个作业分成若干批,每批包含相邻的若干作业。从时刻 0 开始,分批加工这些作业。在
    每批作业开始前,机器需要启动时间 S ,而完成这批作业所需的时间是单独完成批中各个作
    业需要时间的总和。单独完成第i 个作业所需的时间是 i
    t ,所需的费用是它的完成时刻乘以
    一个费用系数 i
    f 。同一批作业将在同一时刻完成。例如,如果在时刻T 开始一批作业
    x x x k , 1, ,    ,则这一批作业的完成时刻均为 1
    ( ) T S t t t      x x x k    。最优批处理
    问题就是要确定总费用最小的批处理方案。例如,假定有 5 个作业等待批处理,且
    1 2 3 4 5 1 2 3 4 5 S t t t t t f f f f f    1,( , , , , ) (1,3, 4, 2,1),( , , , , ) (3, 2,3,3,4)
    如果采用批处理方案{1,2},{3},{4,5},则各作业的完成时间分别为(5,5,10,14,14) ,各
    作业的费用分别为(15,10,30, 42,56) ,因此,这个批处理方案总费用是 153。
    算法设计:
    对于给定的待批处理的n 个作业,计算其总费用最小的批处理方案。
    数据输入:
    由文件 input.txt 提供输入数据。文件的第 1 行是待批处理的作业数n , 第 2 行是启动
    时间 S 。接下来每行有 2 个数,分别为单独完成第i 个作业所需的时间是 i
    t 和所需的费用系
    数 i
    f 。
    结果输出:
    将计算出的最小总费用输出到文件 output.txt 中。
    输入文件示例 输出文件示例
    input.txt output.txt
    5
    1
    1 3
    3 2
    4 3
    2 3
    1 4
    153

    【题解】

    设dp[i]表示i..n这些作业完成花费的最少时间 则dp[i] = min(dp[j]+(f[i]+f[i+1]+..+f[n])(S+t[i]+t[i+1]+...+t[j-1])); 把i,i+1,i+2..j-1作为第一段 N^2的算法.O(N)的还是算了吧。。。

    【代码】

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int N = 10000;
    const int M = 1e4;
    
    int n,s;
    int t[N+10],f[N+10];
    int tt[N+10],ff[N+10];
    int dp[N+10];
    
    int main(){
        //freopen("C://Users//Administrator//Desktop//测试数据//ch3//prog32//test//batch20.in","r",stdin);
        cin >> n;
        cin >> s;
        for (int i = 1;i <= n;i++) cin >> t[i] >> f[i];
        for (int i = n;i >= 1;i--){
            tt[i] = tt[i+1] + t[i];
            ff[i] = ff[i+1] + f[i];
        }
        dp[n+1] = 0;
        for (int i = n;i >= 1;i--){
            dp[i] = -1;
            for (int j = i+1;j <= n+1;j++){
                int temp = dp[j] + ff[i]*(s+tt[i]-tt[j]);
                if (dp[i]==-1) dp[i] = temp;
                else dp[i] = min(dp[i],temp);
            }
        }
        printf("%d
    ",dp[1]);
        return 0;
    }
    
    
  • 相关阅读:
    (转载) MTK芯片不开机必杀全攻略
    <19> MTK10A 修改模拟时钟表盘、表针的显示模式
    (转载) MTK flash
    (转载) MTK申请内存
    (转载) 标准C中的字符串操作函数
    pcb布线时线宽与耐流的关系
    (转载) vb6的数据类型
    (转载) MTK驱动开放基础知识
    (转载) MTK常用函数及宏定义
    xx了Windows正版验证
  • 原文地址:https://www.cnblogs.com/AWCXV/p/11665083.html
Copyright © 2011-2022 走看看