首页 > 编程语言 >C++新U4-贪心算法2

C++新U4-贪心算法2

时间:2024-03-12 14:13:47浏览次数:40  
标签:饼干 int U4 cin C++ ++ 孩子 活动 贪心

[【贪心算法(二)】分发饼干]

 

 

 

 

【题意分析】
将饼干分发孩子手上,并且使得满足的孩子数量最多

【思路分析】
为了尽可能满足最多数量的孩子,按照孩子想要获得的饼干大小从小到大的顺序依次满足每个孩子,且对于每个孩子,应该选择可以满足这个孩子的胃口且尺寸最小的饼干。将饼干大小和孩子所需的饼干大小从小到大排序,都从第一个开始选取,如果可以满足当前孩子需求,满足数量+1,并且孩子和饼干都后移一位,如果不满足那么就将饼干后移一位,查看更加大的饼干是否可以满足当前的孩子,直到饼干或者孩子遍历完

【参考代码】
#include <algorithm>
#include <iostream>
using namespace std;
//g为饼干的大小,c孩子所需的饼干大小
int g[10010], c[10010];
int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        cin >> g[i];
    }
    for (int i = 0; i < m; i++) {
        cin >> c[i];
    }
    //将饼干大小和孩子所需的饼干大小从小到大排序
    sort(g, g + n);
    sort(c, c + m);
    // 记录当前有多少个孩子满足
    int ans = 0;
    // 分别表示饼干和孩子的下标
    int i = 0, j = 0;
    while (i < n && j < m) {
        // 当前的饼干大小可以满足下标为j的孩子
        if (g[i] >= c[j]) {
            // 将人和饼干往后移动一位,满足的人数+1
            i++;
            j++;
            ans++;
        } else {
            i++;
        }
    }
    // 输出满足的人数
    cout << ans << endl;
    return 0;
}
View Code

 

[【贪心算法(二)】游玩]

 

 

 

 

【题意分析】
让所有人都能坐船出海游玩,尽可能让两个人坐一条船,使得出海的船数量最少

【思路分析】
要使得出海的船数量最少,尽可能让两人去搭载一艘船。考虑体重最轻的人,若他不能与体重最重的人同乘一艘船,那么体重最重的人无法与任何人同乘一艘船,此时应单独分配一艘船给体重最重的人。若他能与体重最重的人同乘一艘船,那么他也能与其余任何人同乘一艘船,为了尽可能地利用船的承载重量,让他与体重最重的人同乘一艘船。

【参考代码】
#include <algorithm>
#include <iostream>
using namespace std;
int arr[1010];
int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    // 按照体重从轻到重排序
    sort(arr, arr + n);
    // 建立双指针,一个指针从头选择重量小的人,另一个从尾选择重量大的人
    int i = 0;
    int j = n - 1;
    // 统计需要多少条船
    int ans = 0;
    while (i <= j) {
        // 当前体重最轻的人和体重最重的人并未超出船的上限
        if (arr[i] + arr[j] <= m) {
            i++;
            j--;
        }
        // 超出船的上限,体重重的人一个人坐船
        else {
            j--;
        }
        // 船的数量+1
        ans++;
    }
    cout << ans << endl;
    return 0;
}
View Code

 

[【贪心算法(二)】活动安排]

 

 

 重点:结束时间早意味着可以给后面留出更多的时间安排活动

 

 

【题意分析】
选取尽可能的多的活动,并且选取的活动的时间并不冲突。

【思路分析】
为了参加更多的活动,对于每一个活动越早结束,其他活动越可能发生。使用贪心算法来解决这个问题。首先将活动按照结束时间从小到大进行排序,然后依次选择结束时间最早的活动判断是否能加入到最大集合中并进行相应的计数

首选左端点最小的活动,接下来判断后面的每一个活动看看是否与上一个活动冲突(即当前的左端点<=上一个选择的活动的右端点),不冲突选择该区间,计数++,更新上一个右端点的变量。

【参考代码】
#include <algorithm>
#include <iostream>
using namespace std;
// 定义结构体,参数为开始时间和结束时间
struct node {
    int s, e;
} a[1010];
// 排序,将结束时间早的排序在前面
bool cmp(node a, node b) {
    return a.e < b.e;
}
int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i].s >> a[i].e;
    }
    sort(a, a + n, cmp);
    // 定义变量为活动结束时间,以第一个数结尾作为活动结束时间
    int last = a[0].e;
    // 活动的参加数量
    int num = 1;
    for (int i = 1; i < n; i++) {
        // 当前活动的开始时间是大于等于活动结束时间
        if (a[i].s >= last) {
            // 活动选取数量+1,更新活动结束时间
            num++;
            last = a[i].e;
        }
    }
    // 输出活动的参加数量
    cout << num;
    return 0;
}
View Code

 

 

作业:系统中有讲解

标签:饼干,int,U4,cin,C++,++,孩子,活动,贪心
From: https://www.cnblogs.com/jayxuan/p/18068167

相关文章

  • C++ Qt开发:QNetworkAccessManager网络接口组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QNetworkAccessManager组件实现Web网页访问。QNetworkAccessManager是Qt网络模块中的关......
  • c++20 模板约束
    concept在c++20中,提案许久的concept被加入到标准中了,这也意味着不用再写恼人的SFINAE了(除非你是一个受虐狂,喜欢对着一堆报错中找到错误的位置)。c++20之前在c++20之前,如果需要对模板实参进行编译期检查,只能使用SFINAE,或者是部分使用c++17添加的ifconstexpr进行......
  • Qt/C++音视频开发69-保存监控pcm音频数据到mp4文件/监控录像/录像存储和回放/264/265/
    一、前言用ffmpeg做音视频保存到mp4文件,都会遇到一个问题,尤其是在视频监控行业,就是监控摄像头设置的音频是PCM/G711A/G711U,解码后对应的格式是pcm_s16be/pcm_alaw/pcm_mulaw,将这个原始的音频流保存到mp4文件是会报错的,在调用avformat_write_header写文件头的时候提示(-22)Invali......
  • c++从零实现reactor高并发服务器!!!
    环境准备linux虚拟机安装升级c/c++编译器gcc/g++选项源代码文件1源代码文件2...源代码文件n-o指定输出的文件名(不能和源文件同名默认是a.out)-g调试-On链接时优化减小体积(n=1-3)-c只编译用于生成库-std=c++11支持c++11标准安装man功能man级别接口......
  • 线段树(C++)
    线段树的本质就是树状数组,只不过线段树不再需要lowbit函数来定位对应数据的存储位置,取而代之的则是直接计算分叉结果位置。node结构体​ 通常而言,线段树所需要的存储空间约等于原数组的4倍。由于线段树需要存储区间的范围,所以我们需要自己定义一个新结构体来方便存储:constint......
  • (C++)树状数组和线段树的VSCode Snippet
    学都学了,肯定要往snippet里塞好东西嘛{ //Placeyoursnippetsforcpphere.Eachsnippetisdefinedunderasnippetnameandhasaprefix,bodyand //description.Theprefixiswhatisusedtotriggerthesnippetandthebodywillbeexpandedandinserted.......
  • 用c++实现净现值的计算
    我是用c++实现的,我是把贴现率保留了四位小数。下面是我写的代码:#include<iostream>#include<cmath>usingnamespacestd;floatjst(intj,floatm,floatlv){while(j!=0){m*=(1+lv);j--;}return1.0/m;}i......
  • C++ 津津的储蓄计划
    描述津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈......
  • C++ 雇佣兵
    描述雇佣兵的体力最大值为M,初始体力值为0、战斗力为N、拥有X个能量元素。当雇佣兵的体力值恰好为M时,才可以参加一个为期M天的战斗期,战斗期结束体力值将为0。在同一个战斗期内,雇佣兵每连续战斗n天,战斗力就会上升1点,n为当前战斗期开始时的战斗力。一个战斗期结束后,雇佣兵需要用若......
  • [3] C++面向对象编程
    Day1函数指针数组简写函数指针typedeftypedefint(*FunPtr)(int,int);FunPtrFunArr[1]={Add};内联函数#pragmaregion内联函数//避免函数跳转对于程序的额外开销//有两种写法1).h中写实现文件(在.h中同时写声明和实现)//2)inline关键字......