贪心算法的初涉(双指针 + “过山车思想”)

news2024/11/15 16:27:13

“过山车”思想

首先我们用一道力扣的题目,来简单了解一下“过山车思想”

3228. 将 1 移动到末尾的最大操作次数 - 力扣(LeetCode)

给你一个 

二进制字符串

 s

你可以对这个字符串执行 任意次 下述操作:

  • 选择字符串中的任一下标 i( i + 1 < s.length ),该下标满足 s[i] == '1' 且 s[i + 1] == '0'
  • 将字符 s[i] 向 右移 直到它到达字符串的末端或另一个 '1'。例如,对于 s = "010010",如果我们选择 i = 1,结果字符串将会是 s = "000110"

返回你能执行的 最大 操作次数。

示例 1:

输入: s = "1001101"

输出: 4

解释:

可以执行以下操作:

  • 选择下标 i = 0。结果字符串为 s = "0011101"
  • 选择下标 i = 4。结果字符串为 s = "0011011"
  • 选择下标 i = 3。结果字符串为 s = "0010111"
  • 选择下标 i = 2。结果字符串为 s = "0001111"

示例 2:

输入: s = "00111"

输出: 0

提示:

  • 1 <= s.length <= 105
  • s[i] 为 '0' 或 '1'

思路就是:想象一个过山车,所有的“1”都是小车,如果遇到了就连起来(长度是cnt),所有“0”都是关卡,当小车碰到关卡时:ans += cnt

代码:

class Solution {
public:
    int maxOperations(string s) {
        int n = s.size(),ans = 0,cnt = 0;
        for(int i=0;i<n;i++){
            if(s[i] == '1') cnt ++;
            else if(i && s[i-1] == '1') ans += cnt;
        }
        return ans;
    }
};

双指针

我们来看一个升级版的:双指针+“过山车”

题目来自codeforces,这个平台对于思维的提升非常非常大,如果你需要很强大的思维,这个平台非常适合你

Problem - 1896B - Codeforces

You are given a string ss of length nn consisting of characters AA and BB. You are allowed to do the following operation:

  • Choose an index 1≤i≤n−1 such that si=Aand si+1=B. Then, swap si and si+1.

You are only allowed to do the operation at most once for each index 1≤i≤n−1. However, you can do it in any order you want. Find the maximum number of operations that you can carry out.

Input

Each test contains multiple test cases. The first line contains the number of test cases tt (1≤t≤10001≤t≤1000). Description of the test cases follows.

The first line of each test case contains a single integer nn (2≤n≤2⋅10^5) — the length of string ss.

The second line of each test case contains the string ss (si=A or si=B).

It is guaranteed that the sum of nn over all test cases does not exceed 2⋅10^5.

Output

For each test case, print a single integer containing the maximum number of operations that you can carry out.

题目的意思大致是:给定一个只包含“AB”的字符串,如果字串是“AB”这种形式那么可以交换i与i+1的位置变成“BA”,每个i只能与前面的i+1交换一次

那还是“过山车”思想,所有的“A”是小车,“B”是关卡,但是这里注意的是交换位置。

比如:“AABB”,最后应该变成的是:“BABA” 而不是 “BBAA”

这里的话就需要一个双指针来每次更新位置

如果是我们需要找到最左边“A”的位置已经最后边“B”的位置,然后ans += right - left,left = right

为了防止越界每次输入的字符串s后面加一个“C”(这个随便加,加什么都行)然后每次right多走一步

代码:

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

int main()
{
    int n,t;
    string s;
    cin >> t;
    while(t --){
        cin >> n >> s;
        s += 'C';
        int l = 0,r = 0,ans = 0;
        while(s[l] == 'B') l ++,r ++;
        while(l < n){
            int cnt = 0;
            while(s[r] == 'A') r ++;
            while(s[r] == 'B') r ++,cnt ++;
            // cout << cnt << " " << l << " " << r << endl;
            if(cnt){
                ans += r - l - 1;
                l = r - 1;
            }else break;
        }
        cout << ans << endl;
    }
    return 0;
}

加油

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1990175.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

京东京造的C2M供应链模式

京东自有品牌业务于2018年1月正式上线&#xff0c;在京东发展已久&#xff0c;依托京东供应链优势&#xff0c;已搭建出京东京造、惠寻、佳佰等多品牌矩阵。 京东给零售企业释放出了一个讯号&#xff1a;C2M崛起&#xff0c;消费者的需求开始走向多元化和个性化&#xff01; …

徐州市委书记宋乐伟一行莅临非凸科技徐州分公司调研

7月23日&#xff0c;徐州市委书记宋乐伟一行莅临非凸科技徐州分公司调研&#xff0c;详细了解非凸科技数智交易产品的生态体系以及AI算力赋能的实践成果&#xff0c;并就相关工作进行了现场指导与交流。 非凸科技徐州分公司位于淮海路经济区金融服务中心云盛大厦&#xff0c;致…

基于JSP、java、Tomcat三者的项目实战--校园交易平台系统--(实习,答辩皆可用到)--万字爆更

技术支持&#xff1a;JAVA、JSP 服务器&#xff1a;TOMCAT 7.0.86 编程软件&#xff1a;IntelliJ IDEA 2021.1.3 x64 全部文件展示 网页实现功能截图 主页 注册 登录 购物车主页 修改功能 修改成功 添加商品功能 添加成功 添加进入购物车功能 支付功能 支付过的历史清单账单…

Comsol 声固耦合条件下超长水管路声传递损失

声固耦合条件指的是声波在固体和液体之间传递时&#xff0c;两者之间存在接触或耦合的情况。在水管路中&#xff0c;声固耦合条件下的声传递损失可以通过以下几个因素来影响和计算&#xff1a; 1. 声波的反射和透射&#xff1a;当声波从一个介质传递到另一个介质时&#xff0c…

服务器 Linux 的网络信息

博主上回大致讲解了文件系统&#xff0c;今天来说说 Linux 的网络信息&#xff0c;还是比较重要的~ 主机名称 临时修改 hostname node01 永久修改 vi /etc/hostname DNS解析 域名解析服务可以将域名转换为IP地址DNS域名劫持 window --> C:\Windows\System32\drivers…

Java 2.2 - Java 集合

Java 集合&#xff0c;也叫做容器&#xff0c;主要是由两大接口派生而来&#xff1a;一个是 Collection 接口&#xff0c;主要用于存放单一元素&#xff1b;另一个是 Map 接口&#xff0c;主要用于存放键值对。对于 Collection 接口&#xff0c;其下又有三个主要的子接口&#…

七大云安全威胁及其应对方法

关注公众号网络研究观获取更多内容。 对于任何依赖云来容纳快速增长的服务的企业来说&#xff0c;确保安全都是重中之重。然而&#xff0c;正如大多数云采用者很快意识到的那样&#xff0c;迁移到动态云环境需要新的和更新的安全措施&#xff0c;以确保数据和其他关键资产在整…

凯特王妃与戴安娜王妃:有跨越时空的优雅共鸣!

显而易见的是都是王妃,而王妃不仅是称谓也是一个头衔,她们同时要承担这个头衔应尽的职责! 在皇室世界里,总有一些名字,如同璀璨星辰,即便时光流转,依旧熠熠生辉。现在让我们揭开一段不为人知的幕后故事——凯特王妃与已故的戴安娜王妃之间,那些超越时代、共通的优雅与情…

前端模块化-手写mini-vite

前言 本文总结了一些关于 Vite 的工作原理&#xff0c;以及一些实现细节。 本节对应的 demo 可以在这里找到。 什么是 Vite Vite 是一个基于浏览器原生 ES imports 的开发服务器。利用浏览器去解析 imports&#xff0c;在服务器端按需编译返回&#xff0c;完全跳过了打包这个…

PyTorch深度学习实战(5)—— Tensor的命名张量和基本结构

1. 命名张量 命名张量&#xff08;Named Tensors&#xff09;允许用户将显式名称与Tensor的维度关联起来&#xff0c;便于对Tensor进行其他操作。笔者推荐使用维度的名称进行维度操作&#xff0c;这样可以避免重复计算Tensor每个维度的位置。支持命名张量的工厂函数&#xff08…

怎么删除iPhone重复照片:解放你的存储空间

在数字化时代&#xff0c;iPhone已成为我们记录生活点滴的重要工具。从家庭聚会的快乐时光到户外冒险的壮观景象&#xff0c;我们依靠iPhone捕捉无数珍贵瞬间。然而&#xff0c;这种便利性带来的一个副作用是&#xff0c;相册很快就会充满重复的照片&#xff0c;不仅占用了宝贵…

【IC设计】时序分析面试题总结(亚稳态、建立/保持裕量计算、最高时钟频率计算、时序违例解决办法)

文章目录 基本概念亚稳态建立时间和保持时间 常见问题1.为什么触发器要满足建立时间和保持时间&#xff1f;2.建立时间裕量和保持时间裕量的计算&#xff1f;3.最高时钟频率的计算&#xff1f;流水线思想&#xff1f;4.时序违例的解决办法&#xff1f; 基本概念 亚稳态 亚稳态…

简单的 CompletableFuture学习笔记

简单的 CompletableFuture学习笔记 这里记录一下自己学习的内容&#xff0c;简单记录一下方便后续学习&#xff0c;内容部分参考 CompletableFuture学习博客 1. CompletableFuture简介 在api接口调用时间过长&#xff0c;调用过多外围接口时&#xff0c;为了提升性能&#x…

Self-study Python Fish-C Note14 P50to51

函数 (part 4) 本节主要讲函数 递归 递归 (recursion) 递归就是函数调用自身的过程 示例1&#xff1a; def fun1(i):if i > 0: print(something)i-1fun1(i) fun1(5) # 这样就会打印五遍 somethingsomething something something something something要让递归正常工作&am…

IDEA2024.2重磅发布,更新完有4G!

JetBrains 今天宣布了其 IDE 家族版本之 2024.2 更新&#xff0c;其亮点是新 UI 现在已是默认设置&#xff0c;并且对 AI Assistant &#xff08;AI助手&#xff09;进行了几项改进。 安装密道 新 UI 的设计更加简约&#xff0c;可以根据需要以视觉方式扩展复杂功能。值得开发…

Arduino学习笔记2——初步认识Arduino程序

Arduino使用的编程语言是C。 一、注释文字 我们可以在程序中插入注释文字来提示开发者代码的作用。在Arduino中&#xff0c;单行注释用的是两个斜杠&#xff0c;多行注释用的是对称的斜杠加星号&#xff1a; 二、函数 和C语言相同&#xff0c;可以看到在打开IDE自动打开的默…

高并发下的分布式缓存 | Cache-Aside缓存模式

Cache-aside 模式的缓存操作 Cache-aside 模式&#xff0c;也叫旁路缓存模式&#xff0c;是一种常见的缓存使用方式。在这个模式下&#xff0c;应用程序可能同时需要同缓存和数据库进行数据交互&#xff0c;而缓存和数据库之间是没有直接联系的。这意味着&#xff0c;应用程序…

Java数据结构 | 二叉树基础及基本操作

二叉树 一、树型结构1.1 树的概念1.2 关于树的一些常用概念&#xff08;很重要&#xff01;&#xff01;&#xff01;&#xff09;1.3 树的表示形式1.4 树的应用 二、二叉树2.1 二叉树的概念2.2 两种特殊的二叉树2.3 二叉树的性质2.4 二叉树的存储2.5 二叉树的基本操作2.5.1 代…

【前端可视化】 大屏可视化项目二 scale适配方案 g6流程图 更复杂的图表

项目介绍 第二个大屏可视化&#xff0c;整个项目利用scale进行按比例适配。 图表更加复杂&#xff0c;涉及到图表的叠加&#xff0c;mark&#xff0c;地图&#xff0c;g6流程图的能等 始终保持比例适配(本项目方案),始终满屏适配(项目一). echarts绘制较为复杂图表&#xff0…

C++:string类(auto+范围for,typeid)

目录 前言 auto typeid 范围for 使用方法 string类的模拟实现 默认构造函数 拷贝构造函数 swap 赋值重载 析构函数 迭代器iterator begin和end c_str clear size capacity []运算符重载 push_back reserve append 运算符重载 insert erase find npos…