算法训练:贪心与回溯

news/2024/11/17 22:45:15/

目录

1.手套(贪心算法)

2.字符串通配符(回溯算法)


1.手套

题目描述:

在地下室里放着n种颜色的手套,手套分左右手,但是每种颜色的左右手手套个数不一定相同。A先生现在要出门,所以他要去地下室选手套。但是昏暗的灯光让 他无法分辨手套的颜色,只能分辨出左右手。所以他会多拿一些手套,然后选出一双颜色相同的左右手手套。现在的问题是,他至少要拿多少只手套(左手加右 手),才能保证一定能选出一双颜色相同的手套。 给定颜色种数n(1≤n≤13),同时给定两个长度为n的数组left,right,分别代表每种颜色左右手手套的数量。数据保证左右的手套总数均不超过26,且一定存在至少一 种合法方案。

  

输入描述:第一行输入一个正整数n(n ≤ 1000) 第二行为n个数正整数x (x ≤ 1000)

 

输出描述:输出可以产生的幸运的袋子数 

 

测试样例:

 

4,[0,7,1,6],[1,5,0,6]

 

返回:10(解释:可以左手手套取2只,右手手套取8只)

思路分析:

我们从题目中可以看到,我们需要得出一个结果就是至少要拿多少只手套。这里一般采用贪心算法。我们来分析一下:

因为在拿手套的时候,是盲拿的,拿了多少不知道,拿的是右手还是左手的也不知道。因此,我们就必须保证,在拿手套的时候,拿到的数量最起码能够覆盖左手或者右手的所有颜色!基于此再拿一只另外一只手的手套,便是我们需要的结果。

比如测试样例中,我们需要拿到覆盖左手的手套颜色那么多的数量,那就将左手手套的数量全部加起来,然后减去最少的那个颜色的数量再加一,这就是覆盖了左手的颜色可拿到至少的左手手套的数量了!然后再从右手的手套随便取一个,那么就能够保证至少有一个颜色的手套可以匹配得上。

但是要注意0数量的情况,对于0数量的颜色的手套,我们需要将其额外拿出来,因为如果一种颜色的手套,它的右手或者左手的手套数量为0,即使覆盖了一只手的手套颜色的数量,也可能会使另外一只手的手套匹配不上的问题。

代码如下:

class Gloves
{
public:int FindMininum(int n, vector<int> left, vector<int>right){int left_sum = 0, left_min = INT_MAX;int right_sum = 0, right_min = INT_MAX;int sum = 0;//用于统计另一只手的手套为零时,另一只手的手套的个数for (int i = 0; i < n; ++i){if (left[i] * right[i] == 0){sum += left[i] + right[i];//需要额外统计}else{left_sum += left[i];left_min = left_min < left[i] ? left_min : left[i];right_sum += right[i];right_min = right_min < right[i] ? right_min : right[i];}}//将它们加起来,sum + min(left_sum - left_min + 1, right_sum - right_min + 1)这一步//相当于把一只手的所有颜色的手套都拿了,然后再加个1,就是从另外一只手的手套堆取一只。//这样就必定能够至少匹配一双出来。return sum + min(left_sum - left_min + 1, right_sum - right_min + 1) + 1;}
};

2.字符串通配符

题目描述:

问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。 要求: 实现如下2个通配符: *:匹配0个或以上的字符(注:能被*和?匹配的字符仅由英文字母和数字0到9组成,下同) ?:匹配1个字符 注意:匹配时不区分大小写。 输入: 通配符表达式; 一组字符串。 输出: 返回不区分大小写的匹配结果,匹配成功输出true,匹配失败输出false

 

输入描述:先输入一个带有通配符的字符串,再输入一个需要匹配的字符串

 

输出描述:返回不区分大小写的匹配结果,匹配成功输出true,匹配失败输出false

 

样例:

输入: te?*.*

输出: txtec.cpp

返回:false

 

输入: te?*.*

输出: tetedsdsdc.cpp

返回:true

思路分析

要匹配字符串,有以下三种情况:

①它是字符,并且相等。那么就直接往下走。

②它是'?',问号可以跟任何字符匹配。那么直接往下走。

③它是'*',星号有三种情况:

⭐它没得匹配,即已经走完,这个星号不需要匹配任何字符。

⭐它只需要匹配一个字符,那么直接往下走。

⭐它需要匹配很多个字符,那么这个字符串不需要往下走,需要匹配的字符串往下走。

往下走即使用回溯,即递归算法。

#include <iostream>
#include <string>
using namespace std;
bool strMach(const char* parten, const char* str)
{if (*parten == '\0' && *str == '\0'){return true;}if (*parten == '\0' || *str == '\0'){return false;}if (*parten == '?'){return strMach(parten + 1, str + 1);}else if (*parten == '*'){return strMach(parten + 1, str) || strMach(parten + 1, str + 1) || strMach(parten, str + 1);}else if (*parten == *str){return strMach(parten + 1, str + 1);}return false;
}
int main() {string parten, str;cin >> parten >> str;bool ret = strMach(parten.c_str(), str.c_str());if (ret){cout << "true" << endl;}else {cout << "false" << endl;}return 0;
}

http://www.ppmy.cn/news/35149.html

相关文章

【redis】redis缓存更新策略

目录一、缓存更新策略二、主动更新策略三、Cache Aside Pattern3.1 删除缓存还是更新缓存?3.2 如何保证缓存与数据库的操作同时成功或失败&#xff1f;3.3 先操作缓存还是先操作数据库3.3.1 先删缓存再删库3.3.2 先删库再删缓存一、缓存更新策略 1.内存淘汰&#xff1a;不用自…

Flutter-Scaffold组件

在Flutter开发当中&#xff0c;我们可能会遇到以下的需求&#xff1a;实现页面组合使用&#xff0c;比如说有悬浮按钮、顶部菜单栏、左右抽屉侧边栏、底部导航栏等等效果。Scaffold组件可以帮我们实现上面需求说的效果。这篇博客主要分享容器组件的Scaffold组件的使用&#xff…

【数据结构篇C++实现】- 堆

文章目录&#x1f680;一、堆的原理精讲⛳&#xff08;一&#xff09;堆的概念⛳&#xff08;二&#xff09;看图识最大堆⛳&#xff08;三&#xff09;详解堆是用数组表示的树&#x1f680;二、堆的向下调整算法&#x1f680;三、堆的向上调整算法&#x1f680;四、将任意一棵…

古茗科技面试:为什么 ElasticSearch 更适合复杂条件搜索?

文章目录 ElasticSearch 简介倒排索引联合索引查询跳表合并策略Bitset 合并策略MySQL 最多使用一个条件涉及的索引来过滤,然后剩余的条件只能在遍历行过程中进行内存过滤。 上述这种处理复杂条件查询的方式因为只能通过一个索引进行过滤,所以需要进行大量的 I/O 操作来读取行…

STM32-9 STM32CubeMX的使用方法

一、 说明 本项目是基于FreeRTOS项目的STM32CubeMX开发方式&#xff0c;说明了具体配置与相关参数&#xff0c;以及mdk使用&#xff0c;裸机也可以参考本配置。 二、项目建立步骤 1、新建项目 2、选择芯片型号 3、配置时钟 RCC 设置&#xff0c;选择 HSE(外部高速时钟) 和L…

【C#学习记录】如何让界面控件实现自适应布局(Winform)

小伙伴们大家好,我是雷工! 在软件界面设计中,客户常常要求设计的界面可以随意缩放,缩放过程中,界面中的按钮等控件也会随着窗体变大缩小自动调整显示位置和尺寸大小。在C#的Winform窗体中如何实现这个效果,下面我们一起学习下。 一、样例开发环境 本样例的程序运行环境…

软件测试学习书籍【附电子版】

零基础学软件测试需要读哪些书籍?软件测试经典书籍推荐什么?对于学习软件测试而言&#xff0c;取得一本好书做指导&#xff0c;那是相当的有价值&#xff0c;好书相当于一位好老师&#xff0c;带你入门&#xff0c;带你走进知识深处&#xff0c;下面小编就给大家推荐一些软件…

MySQL-事务

目录 &#x1f341;什么是事务 &#x1f341;隔离级别 &#x1f343;未提交读 &#x1f343;已提交读 &#x1f343;可重复读 &#x1f343;可串行化 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;MySQL专栏&#xff1a;MySQL专栏地址 什么是事务 多条sql语…