《面试准备》c/c++贪心算法实例

2023-11-11

贪心算法问题1(西红柿首富的烦恼):

王多鱼获得了一笔的奖金X,要求购买最少的商品把钱花光,即没有零钱剩下,否则奖金会被没收。

输入:

一个整数k:商品的种类(每个种类商品个数不限);

第i类商品的价值a[i];

一个整数m:奖金总额;

输出:

最少商品数量

举例:

输入:

7

1 2 5 10 20 50 100

288

输出:

8

代码:

c++代码实现(贪心算法):

/**王多鱼问题*/
#include <iostream>

using namespace std;

int main()
{
    int k,n,m,cnt=0,a[1000];
    cout << "商品的种类" << endl;
    cin>>k;
    cout << "从小到大输入商品的价值" << endl;
    for(int i=1;i<=k;i++)
        cin>>a[i];
    cout << "输入奖金总额" << endl;
    cin>>m;
    for(int i=k;i>=1;i--){
        if(m>=a[i]){
            n = m/a[i];
            m = m - n*a[i];
            cnt +=n;
            cout<<a[i]<<"元的商品:"<<n<<"个"<<endl;
            if(m==0)
                break;
        }
    }
    cout<<"最少的商品数量:"<<cnt<<endl;
    return 0;
}

测试结果: 

贪心算法问题2(西红柿首富的烦恼升级):

王多鱼获得了一笔的奖金X,要求购买最少的商品把钱花光,即没有零钱剩下,否则奖金会被没收。

输入:

一个整数k:商品的种类(每个种类商品个数有限);

第i类商品的价值a[i];

第i类商品的数量b[i];

一个整数m:奖金总额;

输出:

最少商品数量

举例:

输入:

7

1 2 5 10 20 50 100

5 5 5 5 5 5 1

288

输出:

9

代码:

c++代码实现(贪心算法):

/**王多鱼问题*/
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    int k,n,m,p,cnt=0,a[1000],b[1000];
    cout << "商品的种类" << endl;
    cin>>k;
    cout << "从小到大输入商品的价值" << endl;
    for(int i=1;i<=k;i++)
        cin>>a[i];
    cout << "依次输入每类商品的数量" << endl;
    for(int i=1;i<=k;i++)
        cin>>b[i];
    cout << "输入奖金总额" << endl;
    cin>>m;
    for(int i=k;i>=1;i--){
        if(m>=a[i]){
            n = m/a[i];
            p = min(n,b[i]);
            m = m - p*a[i];
            cnt +=p;
            cout<<a[i]<<"元的商品:"<<p<<"个"<<endl;
            if(m==0)
                break;
        }
    }
    cout<<"最少的商品数量:"<<cnt<<endl;
    return 0;
}

测试结果:

贪心算法问题3(最多课程问题): 

start_time 8 9 10 12 13
end_time 11 10 15 14 15

一天有n节课,输入起止时间,每节课时间不能冲突,求这一天最多能上多少节课?

输入:

课程起止时间(按时间先后顺序输入),以‘q’结束;

输出:

最多能上多少节课

举例:

输入:

8,11

9,10

10,15

12,14

13,15

q

输出:

2

#include <iostream>
#include <vector>
#include <cstring>
#include <string.h>
using namespace std;

typedef struct Suject_time{
    int begin_time; //课程开始时间
    int end_time;   //课程结束时间
}suject_time;

int main()
{
    vector<suject_time>Subject;
    string s,p,s1,s2;
    int cnt=1;
    suject_time tmp;
    cout << "输入起止时间,输入'q'字符结束" << endl;
    cin >>s;
    //p = s.substr(s.find(","));
    //s1 = s.substr(s.find_first_not_of(","),s.size()-p.size());
    //s2 = s.substr(s.find_first_of(",")+1,p.size()-1);
    //cout <<s1<< endl;
    //cout <<s2<< endl;
    while(s[0]!='q'){
        p = s.substr(s.find(","));
        s1 = s.substr(s.find_first_not_of(","),s.size()-p.size());
        s2 = s.substr(s.find_first_of(",")+1,p.size()-1);
        tmp.begin_time = stoi(s1);
        tmp.end_time = stoi(s2);
        Subject.push_back(tmp);
        cin>>s;                       //循环输入起止时间
    }
    for(int i=0;i<Subject.size();){
        for(int j=i+1;i<Subject.size();j++){
            if(Subject[j].begin_time>=Subject[i].end_time){
                i =j;
                cnt++;             //计数
                break;
            }
            else
                i++;
        }
    }
    Subject.begin.
    cout<<"最大能上课程数:"<<cnt<<endl;
    return 0;
}

测试:

贪心算法问题4(最多课程问题升级):  

start_time 13 10 13 15 11
end_time 17 16 15 17 13

一天有n节课,输入起止时间,每节课时间不能冲突,求这一天最多能上多少节课?

输入:

课程数量n

每个课程的起止时间(乱序

输出:

最多能上多少节课

举例:

输入:

13 17

10 16

13 15

15 17

11 13

输出:

3

代码:

#include <iostream>
#include <vector>
#include <map>    //map(key-vaule) 每个key按顺序排列,不可改变和重复,value可以改变
#include <list>   //set只有一个key,每个key按顺序排列,不可重复可改变
#include <cstring>
#include <string.h>
using namespace std;

typedef struct Suject_time{
    int begin_time;         //课程开始时间
    int end_time;           //课程结束时间
    int sustained_time;     //课程持续时间
}suject_time;

list<suject_time>s;
list<suject_time>::iterator iter,iter1,iter2,iter3,iter4;        //指针迭代器
//map<int,int>::iterator iter;            //map迭代器
//map<int,int>s;                         //定义map
int n,cnt=1,maxcnt=1;

bool compare_begin_time(const suject_time tmp1, const suject_time tmp2){
    return (tmp1.begin_time < tmp2.begin_time);
}

//根据sustained_time初步帅选最佳的课程
void saixuan(){
    for(iter = s.begin(); iter != s.end(); iter++){
        for(iter1 = s.begin(); iter1 != s.end();iter1++){
            if(iter->begin_time==iter1->begin_time){
                if(iter->sustained_time>iter1->sustained_time){
                    s.erase(iter);
                    iter = s.begin();   //不像数组,erase后长度变小,指针需要重新指向begin
                    break;
                }
                if(iter->sustained_time<iter1->sustained_time){
                    s.erase(iter1);
                    iter = s.begin();   //不像数组,erase后长度变小,指针需要重新指向begin
                    break;
                }
            }
        }
    }
}

//贪心
void tanxin(){
    for(iter2 = s.begin(); iter2 != s.end();iter2++){
         for(iter3 = iter2; iter3 != s.end();){
            for(iter4 = ++iter3; iter4 != s.end();iter4++){
                iter3--;
                if(iter4->begin_time>=iter3->end_time){
                    //cout<<iter4->begin_time<<">"<<iter3->end_time<<endl;
                    iter3 =iter4;
                    cnt++;             //计数
                    break;
                }
                else
                    iter3++;
            }
        }
        if(maxcnt<cnt)
            maxcnt = cnt;
        cnt = 1;
    }

}

int main()
{
    suject_time tmp;
    string s1,s2;
    cout<<"输入课程数量:"<<endl;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>s1;
        cin>>s2;
        tmp.begin_time=stoi(s1);
        tmp.end_time=stoi(s2);
        tmp.sustained_time=tmp.end_time-tmp.begin_time;
        //s[tmp.begin_time] = tmp.end_time;   //map映射
        s.push_back(tmp);
    }
    saixuan();
    //list的插入和删除
    tmp.begin_time=10;
    tmp.end_time=100;
    tmp.sustained_time=90;
    s.insert(s.begin(),tmp);
    s.erase(s.begin());
    s.sort(compare_begin_time);

    //**输出
    cout<<"筛选之后:"<<endl;
    for(iter2 = s.begin(); iter2 != s.end(); iter2++) //map、list、set都是指针操作,vector可以用[]操作符
       //cout<<iter->first<<' '<<iter->second<<endl;
       cout<<iter2->begin_time<<" "<<iter2->end_time<<endl;
    tanxin();
    cout<<"最大能上课程数:"<<maxcnt<<endl;
    //}
    return 0;
}

测试:

 贪心算法问题5(排队打水最少等待时间问题):

有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2………..tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少?

输入:

排队人数n,水龙头个数r

每个人的打水时间a[i]

输出:

至少花费时间

举例:

输入:

5 2

1 2 3 4 6

输出:

22

代码:

#include<iostream>
#include<queue>
#include<stdlib.h>
#include <algorithm>
using namespace std;
/**
class T
{
public:
    int x,y,z;
    T(int a,int b,int c):x(a),y(b),z(c)
    {
    }
};*/
class T
{
public:
    int x;
    T(int a):x(a)
    {
    }
};

bool operator<(const T&t1,const T&t2)
{
    return t1.x>t2.x;    //从小到大出队
}

int a[500];
int main(){
     int n,r,i,re;
     priority_queue<T>q;
     cout<<"分别输入排队人数和水龙头数:"<<endl;
     while(cin>>n>>r){
     	re=0;
     	cout<<"输入每个人打水时间:"<<endl;
     	for(i=0;i<n;i++){
     		cin>>a[i];
		 }
		 sort(a,a+n);
		 for(i=0;i<r;i++){
            q.push(T(a[i]));
		    re+=a[i];
		 }

		for(i=r;i<n;i++){
			T t=q.top();
			int tmp = t.x+a[i];
			re+=tmp;
			q.pop();
			q.push(tmp);
		}
		while(!q.empty()){
			q.pop();
		}
		cout<<"最少排队时间:"<<re<<endl;
	 }
	return 0;
}

测试:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《面试准备》c/c++贪心算法实例 的相关文章

  • 关于贪心算法

    贪心算法 Greedy algorithm 又称贪婪算法 是一种在每一步选择中都采取在当前状态下最好或最优 即最有利 的选择 从而使得问题得到全局最优解 贪心的算法的设计就是要遵循某种规则 不断地选取当前最优解的算法设计方法 贪心算法基本概
  • 马踏棋盘-数据结构 详细教程

    文章目录 一 问题描述 二 问题分析 三 深度优先搜索 Depth First Search 1 基本原理 2 代码预览 四 dfs 贪心算法 1 贪心策略 2 贪心原理 3 核心代码 4 代码预览 五 栈 贪心 1 回溯方法 2 基本操作
  • 记录一次笔试题(R语言)

    记录一次笔试题 R语言 data lt read csv 银行 csv 1 取出李姓 法1 record xingshi c FALSE FALSE FALSE FALSE for i in 1 4 if substring data i
  • 算法设计与分析部分

    一 算法概述 算法性质 算法是由若干条指令组成的有穷序列 且满足下述4条性质 输入 有零个或多个由外部提供的量作为算法的输入 输出 算法产生至少一个量作为输出 确定性 组成算法的每条指令是清晰的 无歧义的 有限性 算法中每条指令的执行次数是
  • 2023华为OD机试真题【最短木板长度/贪心算法】

    题目描述 小明有 n 块木板 第 i 1 i n 块木板长度为 ai 小明买了一块长度为 m 的木料 这块木料可以切割成任意块 拼接到已有的木板上 用来加长木板 小明想让最短的木板尽量长 请问小明加长木板后 最短木板的长度可以为多少 输入描
  • 数据结构三大算法(案例解析)

    概述 本文讲述数据结构中最常用到的三大算法 分治法 动态规划法和贪心算法 主要从这些算法的经典案例入手来对算法进行分析和理解 分治法 分治法可以通俗的理解为将一条大鱼分成好几块 分别料理每一块鱼肉 然后再组成一道菜 也就是说分治法是将一个大
  • 《面试准备》c/c++最少装箱问题(动态规划)

    问题描述 出口质量不等的钻石n颗 至少需要多少个箱子 输入 一个整数m 箱子最大承载重量 一个整数n 钻石的个数 第i颗钻石的质量大小a i 输出 最少需要多少箱子 举例 输入 10 5 4 5 7 3 6 输出 3 c 代码实现 动态规划
  • 【数据结构与算法】3.(单向、无向、带权)图,广度、深度优先搜索,贪心算法

    文章目录 1 图简介 2 图的存储方式 2 1 邻接矩阵存储方法 2 2 邻接表存储方法 3 有向 无向图和查询算法 3 1 数据结构 3 2 广度优先算法BFS 3 3 深度优先算法DFS 3 3 1 DFS查询单条路径 3 3 2 DF
  • 骑士周游问题

    算法 1 骑士周游问题 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的 8x8 棋盘中 0 7 0 7 的某个方格中 马鞍走起规则 马走日字 进行移动 要求每个方格只进入一次 走遍棋盘上全部64个方格 3 会使用到图的遍历算法 D
  • 贪心算法之背包问题

    贪心算法之背包问题 背包问题是算法的经典问题 分为部分背包和0 1背包 主要区别如下 部分背包 某件物品是一堆 可以带走其一部分 0 1背包 对于某件物品 要么被带走 选择了它 要么不被带走 没有选择它 不存在只带走一部分的情况 部分背包问
  • C语言之贪心算法疯牛

    疯牛 时间限制 1000 ms 内存限制 65535 KB 难度 4 描述 农夫 John 建造了一座很长的畜栏 它包括N 2 lt N lt 100 000 个隔间 这些小隔间依次编号为x1 xN 0 lt xi lt 1 000 000
  • 华为OD机试真题-最大利润【C++ Java Python】

    文章目录 目录 题目内容 解题思路 Java代码 Python代码 C 代码 题目内容 商人经营一家店铺 有number 种商品 由于仓库限制每件商品的最大持有数量是 item index 每种商品的价格是 price item index
  • c/c++笔试面试题_6

    几个简单的c 面试题 2006 10 14 14 50 今天偶然看见这几个面试题 很有感触 想起一年前自己的求职经历 1 引言 本文的写作目的并不在于提供C C 程序员求职面试指导 而旨在从技术上分析面试题的内涵 文中的大多数面试题来自各大
  • 4-2 背包问题(贪心)

    4 2 背包问题 贪心 与0 1背包问题类似 所不同的只是在选择物品i装入背包时 可以选择物品的一部分而不一定要全部 1 i n 用贪心算法解背包问题的基本步骤是 首先计算每种物品单位重量的价值vi wi 然后 依贪心选择策略 将尽可能多的
  • 2020算法设计与分析 官方考前模拟卷 参考答案

    算法设计与分析 样例试题 算法设计与分析总结笔记 注 此试题仅供了解题型 和期末考试试题没有任何直接关系 FBI Warning 这套题难度较大 千万不要坏了心态 xj大佬说要是考试那么难他直播粪坑蝶泳 Power By 王宏志教授 5 分
  • 蓝桥杯备赛:贪心

    例题1 最少砝码 问题描述 你有一架天平 现在你要设计一套砝码 使得利用这些砝码可以称出任意 小于等于 NN 的正整数重量 那么这套砝码最少需要包含多少个砝码 注意砝码可以放在天平两边 输入格式 输入包含一个正整数 N 输出格式 输出一个整
  • Acwing 906. 区间分组

    1 将所有区间按照左端点从小到大排序 2 从前往后处理每个区间 判断能否将其放到某个现有的组中 L i gt Max r 1 如果不存在这样的组 则开新组 然后将其放进去 2 如果存在这样的组 将其放进去 并更新当前组的Max r incl
  • 37: 合并区间

    题目 以数组 intervals 表示若干个区间的集合 其中单个区间为 intervals i starti endi 请你合并所有重叠的区间 并返回 一个不重叠的区间数组 该数组需恰好覆盖输入中的所有区间 思路 这道题我的思路完全正确 先
  • 雪糕的最大数量 排序+贪心

    雪糕的最大数量 雪糕的最大数量 题目描述 样例 数据范围 思路 代码 题目描述 夏日炎炎 小男孩 Tony 想买一些雪糕消消暑 商店中新到 n 支雪糕 用长度为 n 的数组 costs 表示雪糕的定价 其中 costs i 表示第 i 支雪
  • 【贪心算法】【中位贪心】LeetCode:100123.执行操作使频率分数最大

    涉及知识点 双指针 C 算法 前缀和 前缀乘积 前缀异或的原理 源码及测试用例 包括课程视频 贪心算法 题目 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 你可以对数组执行 至多 k 次操作 从数组中选择一个下标 i 将 n

随机推荐

  • python图像分析_Python图像处理

    作者 Garima Singh 编译 VK 来源 Git Connected 以前照相从来没有那么容易 现在你只需要一部手机 拍照是免费的 如果我们不考虑手机的费用的话 就在上一代人之前 业余艺术家和真正的艺术家如果拍照非常昂贵 并且每张照
  • MySQL-内连接、外连接和全连接

    连接过程 连接过程首先要确定第一个表 称为驱动表 驱动表上查询的每一条记录分别需要到被驱动表上查找符合过滤条件的记录 因此驱动表只需要访问一次 被驱动表可能需要访问多次 内连接 对于内连接的两个表 驱动表中的记录在被驱动表中找不到匹配的记录
  • php echo换行

  • 前端终于要破局了!

    正文 前段时间 掘金热帖 放心 前端死不了 在前端圈疯传 百度前端大佬表明 前端技术是依托于互联网行业的 只要行业还在 它就会有用武之地 就会有价值 总的来说 技能跟上发展 前端就不会死 谁掌握得更深 应用得更好 谁就更容易脱颖而出 为此
  • Spark报Total size of serialized results of 12189 tasks is bigger than spark.driver.maxResultSize

    一 异常信息 Total size of serialized results of 12189 tasks is bigger than spark driver maxResultSize 1024M Total size of ser
  • [万能解决问题]MATLAB has encountered an internal problem and needs to close.

    1 错误的描述及解决办法 使用Matlab和C 混合编程时 即编写完mex文件 调用时 经常会提示下面的错误 触发上述错误的情况 1 如果一进入mexFunction函数就报错 即不会命中函数中设置的任何断点 也会报错 那么说明 你忘记了将
  • Keil5的仿真调试

    Keil5基本的仿真调试操作 首先点击魔法棒 然后输入你板子上所用的晶振 然后进入debug 然后选择 Use Simulator 然后点击OK 然后点击调试按钮 然后就会出现调试页面 我这里是已经把汇编窗口给挪到右侧了 你第一次打开可能是
  • 红黑树详解

    1 红黑树的概念 红黑树 是一种二叉搜索树 但在每个结点上增加一个存储位表示结点的颜色 可以是Red或 Black 通过对任何一条从根到叶子的路径上各个结点着色方式的限制 红黑树确保没有一条路径会比其他路径长出俩倍 因而是接近平衡的 红黑树
  • 【C】数组的地址

    目录 一维数组 二维数组 数组的地址和数组首元素地址相同 只有在sizeof 和 的情况下 取出的是整个数组的地址 其他情况下都是首元素地址 一维数组 sizeof 有 无 二维数组 sizeof 有 无 注意 这里二维数组的一个元素中是两
  • Docker高级——网络配置

    Docker网络 默认网络 安装 Docker 以后 会默认创建三种网络 可以通过 docker network ls 查看 root test docker network ls NETWORK ID NAME DRIVER SCOPE
  • html自定义列表第三层嵌套,搜索引擎优化一般不抓取三层以上的表格嵌套

    一 DIV CSS的网页制作对 SEO 的优势 由于国外都流行用DIV CSS来制作网页 这点与大多国内的企业站点用TABLE不同 所以想谈一下DIV CSS的网页制作对 SEO 的优势有哪些 这些都是比较于TABLE而言的 DIV CSS
  • Python爬虫实战:2020最新京东商品数据爬虫保姆式教程(小白也能懂)!

    Python爬虫 基于Scrapy爬取京东商品数据并保存到mysql且下载图片 一 项目准备 二 网页及代码分析 三 完整代码 一 项目准备 创建scrapy京东项目 scrapy startproject Jingdong cd Jing
  • QT setWindowFlags函数

    Qt Widget 是一个窗口或部件 有父窗口就是部件 没有就是窗口 Qt Window 是一个窗口 有窗口边框和标题 Qt Dialog 是一个对话框窗口 Qt Sheet 是一个窗口或部件Macintosh表单 Qt Drawer 是一
  • 小程序 function(res)与(res) =>的区别

    前者不可使用 this setData cameraImg res tempImagePath 后者可以使用 this setData cameraImg res tempImagePath 如果在一个对象的方法里面
  • acadacad经典工作空间.cuix_自定义还原CAD“经典”绘图空间?(适用2021~~2015版本)...

    你已选中了添加链接的内容 本文由小8整理首发 版权归本公众号所有 如有侵 请自行删除 在位编辑器 软件安装 应用技巧 图库资料 视频教程 很多小伙伴经常问怎样切换 经典空间 的问题了 从CAD2015版本开始 官方已经取消 AutoCAD
  • response.getWriter().write()和 response.getWriter().print()的区别 以及 PrintWriter对象 和 out对象 的区别

    感谢原文作者 krismile qh 原文链接 https blog csdn net krismile qh article details 89926001 一 response getWriter write 和 response g
  • java并发编程:CopyOnWrite容器介绍

    前言 Copy On Write简称COW 是一种用于程序设计中的优化策略 其基本思路是 从一开始大家都在共享同一个内容 当某个人想要修改这个内容的时候 才会真正把内容Copy出去形成一个新的内容然后再改 这是一种延时懒惰策略 从JDK1
  • radius认证技术

    1 AAA和Radius概述 AAA是验证授权和记账Authentication Authorization and Accounting 的简称 它是运行于NAS上的客户端程序 它提供了一个用来对验证 授权和记账这三种安全功能进行配置的一
  • 西门子S7-200 SMART控制步进电机(二)

    目录 一 开环运动控制方法 二 运动轴概述 三 配置运动控制向导 一 开环运动控制方法 S7 200 SMART CPU提供三种开环运动控制的方法 1 脉冲宽度调制 PWM 内置于CPU中 用于速度 位置或占空比的控制 2 脉冲串输出 PT
  • 《面试准备》c/c++贪心算法实例

    贪心算法问题1 西红柿首富的烦恼 王多鱼获得了一笔的奖金X 要求购买最少的商品把钱花光 即没有零钱剩下 否则奖金会被没收 输入 一个整数k 商品的种类 每个种类商品个数不限 第i类商品的价值a i 一个整数m 奖金总额 输出 最少商品数量