NEFU-2023-算法设计与分析实验三 贪心算法设计

作者的话

大底包含了算法硬性规定的作业代码,并非最优解,仅供参考并会持续更新。勿要无脑copy,对自己负责。如果代码有误或者优化建议,直接相应博客下方评论或者qq找我如果对代码有理解不了的或者疑惑可以询问我,但是请确保你已经自己思考过或者查过搜索引擎(如果我原模原样搜到了资料的话我会锤你的hh)。一些语法和库的资料查询网站受个人风格影响,部分题目解题方式可能没按照教学要求,如有必要请自己按教学要求做一遍。如果可以的话,麻烦借鉴完以后给我博客来个三连啥的,这可能对我以后找工作或者其他博客的推广什么的有些帮助,感谢

如要系统学习可看我的另一篇博客算法小课堂(五)贪心算法

题目一:最优服务次序问题

(1)问题描述:

  设有n 个顾客同时等待一项服务。顾客i需要的服务时间为ti, 1<=i <= n 。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n 个顾客等待服务时间的总和除以n。

(2)编程任务:

  对于给定的n个顾客需要的服务时间,编程计算最优服务次序。

(3)数据输入:

  第一行是正整数n,表示有n 个顾客。接下来的1行中,有n个正整数,表示n个顾客需要的服务时间。

(4)结果输出:

  计算出的最小平均等待时间。

(5)输入示例

10

56 12 1 99 1000 234 33 55 99 812

(6)输出示例 

#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;

const int MAXN = 1000;
int n;
int t[MAXN];

// 比较函数,用于sort函数排序
bool cmp(int a, int b) {
    return a < b;
}

int main() {
    // 输入顾客数量
    scanf("%d", &n);
    // 输入每个顾客需要的服务时间
    for (int i = 0; i < n; i++) {
        scanf("%d", &t[i]);
    }
    // 排序
    sort(t, t + n, cmp);
    double ans = 0;
    // 计算平均等待时间
    for (int i = 0; i < n; i++) {
        ans += (n - i) * t[i];
    }
    printf("%.2lf\n", ans / n);
    return 0;
}

题目二区间相交问题

(1)问题描述:

  给定x 轴上n 个闭区间。去掉尽可能少的闭区间,使剩下的闭区间都不相交。

(2)编程任务:

  给定n 个闭区间,编程计算去掉的最少闭区间数。

(3)数据输入:

  第一行是正整数n,表示闭区间数。接下来的n行中,每行有2 个整数,分别表示闭区间的2个端点。

(4)结果输出:

计算出的去掉的最少闭区间数。

(5)输入示例

3

10 20

10 15

20 15

(6)输出文件示例 

2

#include <iostream>

#include <algorithm>

using namespace std;

 

const int N = 1010;

 

struct Range {

    int l, r;

    bool operator< (const Range& W) const {

        return r < W.r;

    }

}range[N];

 

int main() {

    int n;

    cin >> n; // 输入闭区间数

    for (int i = 0; i < n; i++) {

        cin >> range[i].l >> range[i].r; // 输入每个闭区间的左右端点

    }

    sort(range, range + n); // 按照区间右端点从小到大排序

    int res = 1, right = range[0].r; // res表示去掉的区间数,right表示当前区间右端点的最小值

    for (int i = 1; i < n; i++) {

        if (range[i].l > right) { // 如果当前区间和前面的区间没有重叠部分

            res++; // 就保留这个区间

            right = range[i].r;

        }

    }

    cout << n-res << endl; // 输出去掉的最少闭区间数

    return 0;

}

​

题目三汽车加油问题

问题描述:一辆汽车加满油后可行驶nkm。旅途中有若干加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。

算法设计:对于给定的n和k个加油站位置,计算最少加油次数。

数据输入:n:表示汽车加满油后可行驶nkm

          k:旅途中有k个加油站

         k+1个整数:表示第k个加油站与第k-1个加油站之间的距离。第0个加油站表示出发地,汽车已加满油。第k+1个加油站表示目的地。

数据输出:最少加油次数和具体在哪几个加油站加油。

例如: n=7  k=7

  K+1个整数:1 2 3 4 5 1 6 6

最优值:4

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1010;

int n, k;
int d[N];

int main() {
    cin >> n >> k;
    for (int i = 1; i <= k + 1; i++) {
        cin >> d[i];
    }
    int res = 1, now = n;
    for (int i = 1; i <= k; i++) {
        if (now < d[i]) { // 如果当前油量无法到达下一个加油站
            res++; // 就在当前加油站加满油
            now = n; // 油量变为n
        }
        now -= d[i]; // 消耗d[i]的油量
    }
    cout << res << endl; // 输出最少加油次数
    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟雨平生9527

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值