首页 > 编程语言 >【C++】力扣101-分配问题和区间问题

【C++】力扣101-分配问题和区间问题

时间:2024-02-01 17:12:06浏览次数:34  
标签:vector int 孩子 C++ 力扣 num scores 101 size

1.有一群孩子和一堆饼干,每个孩子有一个饥饿度,每个饼干都有一个大小。每个孩子只能吃一个饼干,且只有饼干的大小不小于孩子的饥饿度时,这个孩子才能吃饱。求解最多有多少孩子可以吃饱。

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

int calculate(vector<int>& hungry, vector<int>& size);
int main(void) {
  vector<int> hungry;//孩子的饥饿度数组
  vector<int> size;//饼干的大小

  int hun = 0;
  int cook = 0;
  int chilren_num = 0;
  int cookie_num = 0;
  cout << "请输入孩子的数量:";
  cin >> chilren_num;
  cout << "请输入饼干的数量:";
  cin >> cookie_num;

  while (chilren_num > 0) {
    cout << "请输入孩子的饥饿度:";
    cin >> hun;
    hungry.push_back(hun);
    chilren_num--;
  }
  while (cookie_num > 0) {
    cout << "请输入饼干的大小:";
    cin >> cook;
    size.push_back(cook);
    cookie_num--;
  }
  int satisfied = calculate(hungry, size);
  cout << "最多能满足" << satisfied << "个孩子的饥饿度。" << endl;
  return 0;
}

int calculate(vector<int>& hungry, vector<int>& size) {
  sort(hungry.begin(), hungry.end());
  sort(size.begin(), size.end());
  int i = 0;
  int j = 0;
  while (i < hungry.size() && j < size.size()) {
    if (hungry[i] <= size[j]) {
      i++;
    }
    j++;
  }
  return i;
}

 2.一群孩子站成一排,每一个孩子有自己的评分。现在需要给这些孩子发糖果,规则是如果一个孩子的评分比自己身旁的一个孩子要高,那么这个孩子就必须得到比身旁孩子更多的糖果;所有孩子至少要有一个糖果。求解最少需要多少个糖果。

题解:做完了题目 455,你会不会认为存在比较关系的贪心策略一定需要排序或是选择?虽然这一道题也是运用贪心策略,但我们只需要简单的两次遍历即可:把所有孩子的糖果数初始化为 1;

先从左往右遍历一遍,如果右边孩子的评分比左边的高,则右边孩子的糖果数更新为左边孩子的糖果数加 1;

再从右往左遍历一遍,如果左边孩子的评分比右边的高,且左边孩子当前的糖果数不大于右边孩子的糖果数,则左边孩子的糖果数更新为右边孩子的糖果数加 1。

通过这两次遍历,分配的糖果就可以满足题目要求了。这里的贪心策略即为,在每次遍历中,只考虑并更新相邻一侧的大小关系。

在样例中,我们初始化糖果分配为 [1,1,1],第一次遍历更新后的结果为 [1,1,2],第二次遍历更新后的结果为 [2,1,2]。

#include <iostream>
#include <vector>
#include <algorithm>  //使用max需要用到
#include <numeric>  //使用accumulate()函数需要用到
using namespace std;
int getMinNum(vector<int>& scores);
int main(void) {
  int chilren_num;//孩子的数量
  int grade = 0;//孩子的分数
  vector<int> scores;
  cout << "请输入孩子的数量:";
  cin >> chilren_num;
  while (chilren_num > 0) {
    cout << "请输入各个孩子的分数:";
    cin >> grade;
    scores.push_back(grade);
    chilren_num--;
  }
  cout << "最少需要" << getMinNum(scores) << "个糖果。\n";

  return 0;
}

int getMinNum(vector<int>& scores) {
  if (scores.size() < 2) {
    return 1;
  }
  vector<int> num(scores.size(), 1);
  //从左到右遍历
  for (int i = 1; i < scores.size(); ++i) {
    if (scores[i] > scores[i - 1]) {
      num[i] = num[i - 1] + 1;
    }
  }
  //从右到左遍历
  for (int j = scores.size() - 1; j > 0; --j) {
    if (scores[j] < scores[j - 1]) {
      num[j] = max(num[j], num[j] + 1);
    }
  }
  return accumulate(num.begin(), num.end(), 0);
}

3.给定多个区间,计算让这些区间互不重叠所需要移除区间的最少个数。起止相连不算重叠。输入是一个数组,数组由多个长度固定为 2 的数组组成,表示区间的开始和结尾。输出一个整数,表示需要移除的区间数量。题解:在选择要保留区间时,区间的结尾十分重要:选择的区间结尾越小,余留给其它区间的空间就越大,就越能保留更多的区间。因此,我们采取的贪心策略为,优先保留结尾小且不相交的区间。具体实现方法为,先把区间按照结尾的大小进行增序排序,每次选择结尾最小且和前一个选择的区间不重叠的区间。我们这里使用 C++ 的 Lambda,结合 std::sort() 函数进行自定义排序。在样例中,排序后的数组为 [[1,2], [1,3], [2,4]]。按照我们的贪心策略,首先初始化为区间[1,2];由于 [1,3] 与 [1,2] 相交,我们跳过该区间;由于 [2,4] 与 [1,2] 不相交,我们将其保留。因

此最终保留的区间为 [[1,2], [2,4]]。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int getNum(vector<vector<int>> ves) {
  if (ves.empty()) {
    return 0;
  }
  //先给每个数组的结尾数排序
  sort(ves.begin(), ves.end(), [](vector<int>& a, vector<int>& b) {
    return a[1] < b[1];
    });
  int prev = ves[0][1];
  int num = 0;
  for (int i = 1; i < ves.size(); i++) {
    if (ves[i][0] < prev) {
      num++;
    }
    else {
      prev = ves[i][1];
    }
  }
  return num;
}
int main(void) {
  vector<vector<int>> ves = { {1,2},{2,4},{1,3} };
  cout << "有" << getNum(ves) << "个数组与其它数组重叠!" << endl;
  return 0;
}

 

标签:vector,int,孩子,C++,力扣,num,scores,101,size
From: https://www.cnblogs.com/smartlearn/p/17997038

相关文章

  • C/C++ 中的宏/Macro
       宏(Macro)本质上就是代码片段,通过别名来使用。在编译前的预处理中,宏会被替换为真实所指代的代码片段,即下图中Preprocessor处理的部分。C/C++代码编译过程-图片来自 ntu.edu.sg根据用法的不同,分两种,Object-like和Function-like。前者用于Object对象,后者......
  • 在Visual Studio中部署GDAL库的C++版本(包括SQLite、PROJ等依赖)
      本文介绍在VisualStudio软件中配置、编译C++环境下GDAL库、SQLite环境与PROJ库的详细方法。  GDAL库是一个非常方便的地理数据处理库,但其在C++环境下的配置与编译流程较为复杂;尤其是最新的GDAL3及以上版本,其在C++环境中的配置更是首先需要满足许多其他的环境配置条件(包括......
  • linux c++读写ini文件,不是用boost
    摘自:https://linuxcpp.0voice.com/?id=65276可以使用标准库中的fstream和string类来读写ini文件。以下是一个示例代码:#include<iostream>#include<fstream>#include<sstream>#include<map>usingnamespacestd;//解析ini文件,返回一个键值对的mapmap<string,string......
  • C++第五十五篇-定时器SetTimer
    使用的一个百度AI代码生成网站: https://yiyan.baidu.com/定时器的实现示例:新建一个程序 编写ConsoleApplication1.cpp#include<iostream>#include<Windows.h>usingnamespacestd;#pragmacomment(lib,"User32.lib")//首先定义一个计时器计时事件的定义#define......
  • 全流程机器视觉工程开发(四)PaddleDetection C++工程化应用部署到本地DLL以供软件调用
    前言我们之前跑了一个yolo的模型,然后我们通过PaddleDetection的库对这个模型进行了一定程度的调用,但是那个调用还是基于命令的调用,这样的库首先第一个不能部署到客户的电脑上,第二个用起来也非常不方便,那么我们可不可以直接将Paddle的库直接做成一个DLL部署到我们的软件上呢?答案是......
  • 【c++】引用的用法
    一、引用的介绍引用还有一个别的叫法:取别名通俗点说:每个人都有一个大名,可能也有一个小名,但是都是指一个人,引用也就是一个变量的别名。1.引用的概念:引用不是定义一个别的变量,而是给一个变量取别名注:引用变量编译器不会为这个变量单独开辟一块内存,它和它引用的变量使用同一块内存2.引......
  • C++ 使用单调时钟按一定时间间隔执行任务
    使用condition_variable实现定时执行任务遇到一个开发任务,需要按一定的时间间隔执行任务,本来是一个简单的功能,直接使用condition_variable就可以了最开始是直接使用condition_variable实现的定时触发机制,代码的大致实现类似于:#include<condition_variable>#include<chrono......
  • 如何在Visual Studio新C++项目中调用之前配置过的库?
      本文介绍在VisualStudio软件中调用C++各种配置、编译完毕的第三方库的方法。  在撰写C++代码时,如果需要用到他人撰写的第三方库(例如地理数据处理库GDAL、矩阵运算库Armadillo等),并不能像Python等语言那样,安装好库后直接在不同代码文件中使用;而是需要每一次新建一个代码文件......
  • 从C向C++——运算符重载
    本文的主要知识点是C++中的运算符重载。1.运算符重载所谓重载,就是赋予新的含义。函数重载(FunctionOverloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作。**运算符重载(OperatorOverloading)**也是一个道理,同一个运算符可以有不同的功能。实际上,我们已经在不知不觉中......
  • 《C++ Primer Plus》(第六版)中文版——思维导图+附录PDF+源代码
    说明,以下文件可在异步社区免费下载不同之处在于原附录PDF文件没有书签,而本文分享的附录文件带有书签本文所有文件下载链接:https://www.123pan.com/s/lO3uVv-uaEKv.html思维导图(图片)以下仅为预览,高清图片可从文章开头下载链接中下载另外后续本人有空会制作XMind脑图版本,会添加......