贪心算法(C语言)

一、会议安排问题

1.1 问题

  (1)对于每个会议i,起始时间bi和结束时间ei,且bi<ei

  (2)[bi,ei]与[bj,ej]不相交,则会议i和会议j相容,bi≥ej或bj≥ei

  (3)目标:在有限的时间内,尽可能多地安排会议

1.2 分析

  选择最早结束的会议

1.3 实现

  (1)初始化:按结束时间递增排序

  (2)选中第一个具有最早结束时间的会议,用last记录时间

  (3)挑剩下的,若i的开始时间>last,则与回忆i与已挑会议相容

  代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<iostream>          //包含输入输出流
#include<algorithm>         //包含算法库
using namespace std;
typedef struct Meet {
    int beg;         //会议开始时间
    int end;         //会议结束时间
    int num;         //会议编号
}Meet;
/*回忆结束时间升序排列*/
bool cmp(Meet x,Meet y) {
    return x.beg < y.beg;
}
int main() {
    /*初始化10个会议*/
    Meet meets[10] = {
        {3,6,1},{2,4,2},{5,7,3},
        {2,6,4},{5,9,5},{3,8,6},
        {8,11,7},{6,10,8},{8,12,9},
        {12,14,10},
    };
    /*调用sort函数对meets数组进行排序,排序规划为cmp*/
    sort(meets,meets+10,cmp);
    int ans = 1;
    /*初始化last为meets[0].end,表示上一个安排的会议的结束时间*/
    int last = meets[0].end;
    cout << "选择第" << meets[0].num << "个会议" << endl;
    /*遍历会议*/
    for(int i=1;i<10;++i) {
        if(meets[i].beg >= last) {
            ans++;
            last = meets[i].end;           //更新最后一个会议的结束时间
            cout << "选择第" << meets[i].num << "个会议" << endl;
        }
    }
    cout << "最多可以安排" << ans << "个会议" << endl;
    system("pause");         //暂停程序运行,等待用户输入任意键继续
    return 1;
}

二、多机调度题

1.1 问题

  (1)设有n个独立的作业(1,2,……,n),由m台相同的机器(M1,M2,……,Mm)进行加工处理,作业i所需的处理时间为ti(1≤i≤n),每个作业均可在任何一台机器上加工处理,但不可间断、拆分

  (2)多级调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成

1.2 分析

  (1)贪心算法求解多机调度问题的贪心策略:最长处理时间的作业优先

  (2)即把处理时间最长的作业分配给最先空闲的机器,这样可以保证处理时间长的作业优先处理,从而在整体上获得尽可能短的处理时间

1.3 实现

  代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct Work {
    int hour;          //工作所需时间
    int num;           //工作编号
}Work;
bool cmp(Work x,Work y) {
    //按照工作时间的降序排序
    return x.hour > y.hour;
}
//选出最先空闲的机器,即返回空闲时间最早的机器的索引
int minR(int rear[],int m) {
    int min = rear[0];
    int t = 0;
    for(int i=1;i<m;i++) {
        if(rear[i]<min) {
            min = rear[i];
            t = i;
        }
    }
    return t;
}
//主函数
int main() {
    const int m = 3;            //机器数量
    const int n = 7;            //工作数量
    int rear[m] = {0};          //记录每台机器的完成时间
    int arr[m][n] = {0};        //记录每台机器执行的工作
    /*声明结构体数组 works[n],表示每个工作的时间和编号*/
    Work works[n] = {
        {2,1},{14,2},{4,3},
        {16,4},{6,5},{5,6},
        {3,7},
    };
    sort(works, works + n,cmp);             //对工作按照所需时间进行排序
    for (int i = 0; i < n; i++) {
        int index = minR(rear, m);          //选出最先空闲的机器
        rear[index] += works[i].hour;       //更新该机器的完成时间
        arr[index][works[i].num - 1] = 1;   //在对应机器的任务记录中标记该工作
    }
    for(int i=0;i<m;i++) {
        cout << "第" << (i+1) << "台机器的任务有:";
        for(int j=0;j<n;j++) {
            if(arr[i][j] == 1) {
                cout << (j+1) << ",";
            }
        }
        cout << "\n   总时间为:" << rear[i] <<endl;
    }
    system("pause");                     //暂停程序运行,等待用户输入任意键继续
    return 1;
}
posted @   Auion  阅读(60)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示