• GHOJ 681 最佳调度问题


    题目描述

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

     

    输入格式

      第一行,两个正整数n和k。

      第二行,n个正整数,是完成n个任务需要的时间。

    输出格式

      一行,一个整数,完成全部任务的最早时间。

     

    输入样例

    7 3

    2 14 4 16 6 5 3

    输出样例

    17

    题解

      容易想到,我们按照顺序对每一个工作放在每一个机器上的情况进行搜索。但是显然会tle,那就需要我们进行剪枝。

      首先,我们设当前情况下的时间为$t$,当前已知的最优解为$ans$,则当$t geqslant ans$时,我们可以直接return。

      这个时候我们想,为了尽可能多剪,我们可以对每个工作进行降序排序,然后从时间长的开始搜。

      其实还有一个剪枝。假设机器$i$和机器$j$当前运作的时间相同,那实际上我们只用搜当前工作放在机器$i$上的情况就好了。

    #include <iostream>
    #include <algorithm>
    
    #define MAX_N (20 + 5)
    #define MAX_M (20 + 5)
    
    using namespace std;
    
    int n, m;
    int a[MAX_N];
    int b[MAX_M];
    int ans = 0x7f7f7f7f;
    
    void DFS(int x, int t)
    {
        if(t >= ans) return;
        if(!x)
        {
            ans = t;
            return;
        }
        bool c[1000] = {0};
        for(register int i = 1; i <= m; ++i)
        {
            if(c[b[i]]) continue;
            c[b[i]]  = true;
            b[i] += a[x];
            DFS(x - 1, max(t, b[i]));
            b[i] -= a[x];
        }
        return;
    }
    
    int main()
    {
        cin >> n >> m;
        for(register int i = 1; i <= n; ++i)
        {
            cin >> a[i];
        }
        sort(a + 1, a + n + 1);
        DFS(n, 0);
        cout << ans;
        return 0;
    } 
    参考程序
  • 相关阅读:
    如何动态确定命名空间
    五种提高 SQL 性能的方法
    无意间发现收藏夹的秘密(^_^,也许大家早就知道了?)
    每个开发人员现在应该下载的十种必备工具,这个是中文的哦
    一个让我狂晕的异常及例行xiao总结
    几个开源项目实体层实现方式比较
    线程池在web上的简单应用
    不为"事务"而"事务"
    构造函数,静态构造函数与继承链
    小Tips两则
  • 原文地址:https://www.cnblogs.com/kcn999/p/10988552.html
Copyright © 2020-2023  润新知