zoukankan      html  css  js  c++  java
  • 最佳调度问题

    题目描述
    假设有n 个任务由k 个可并行工作的机器来完成。完成任务i 需要的时间为ti。试设计一个算法找到出完成这个n 个任务的最佳调度,使得完成全部任务的时间最早。
    对任意给定的整数n 和k,以及完成任务i 需要的时间为ti,1<=i<=n。编程计算完成这n 个任务的最佳调度。
    n<=20,k<=8


    输入
    第1 行有2 个正整数n 和k。第2 行的n 个正整数是完成n 根任务
    需要的时间。


    输出
    计算出的完成全部任务的最早时间

    样例输入
    7 3
    2 14 4 16 6 5 3

    样例输出
    17

    搜索水题,开一个数组sum[i]表示第i个机器上花费的时间,所以每一次将所有任务交给机器后,跑一遍sum[]求最大值,代表完成全部任务需要的时间。然后与ans求最小。

    然而这么会超时。

    所以还是动态更新最小值吧。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<cstring>
     6 using namespace std;
     7 #define rep(i, a, n) for(int i = a; i <= n; ++i)
     8 #define per(i, n, a) for(int i = n; i >= a; --i) 
     9 const int maxn = 1e3 + 5;
    10 const int INF = 0x3f3f3f3f;
    11 int n, k, a[maxn], mach[maxn];
    12 int ans = INF;
    13 bool cmp(int a, int b)
    14 {
    15     return a > b;
    16 }
    17 void dfs(int step, int Max)
    18 {
    19     if(step == n + 1)
    20     {
    21         if(Max < ans) ans = Max; return;
    22     }
    23     if(Max > ans) return;
    24     rep(i, 1, k)
    25     {
    26         if(mach[i] + a[step] > ans) continue; 
    27         mach[i] += a[step];
    28         dfs(step + 1, max(Max, mach[i]));
    29         mach[i] -= a[step];
    30     }
    31 }
    32 int main()
    33 {
    34     freopen("machine.in", "r", stdin);
    35     freopen("machine.out", "w", stdout);
    36     scanf("%d%d", &n, &k);
    37     rep(i, 1, n) scanf("%d", &a[i]);
    38     sort(a + 1, a + n + 1, cmp); 
    39     mach[1] += a[1];
    40     dfs(2, a[2]);
    41     printf("%d
    ", ans);
    42     return 0;
    43 }
  • 相关阅读:
    uva 11294 Wedding
    uvalive 4452 The Ministers’ Major Mess
    uvalive 3211 Now Or Later
    uvalive 3713 Astronauts
    uvalive 4288 Cat Vs. Dog
    uvalive 3276 The Great Wall Game
    uva 1411 Ants
    uva 11383 Golden Tiger Claw
    uva 11419 SAM I AM
    uvalive 3415 Guardian Of Decency
  • 原文地址:https://www.cnblogs.com/mrclr/p/8639359.html
Copyright © 2011-2022 走看看