寒假每日一题2023——4261. 孤独的照片

news2024/12/24 2:44:01

写在前面

题目来源:AcWing 寒假每日一题2023活动
链接:https://www.acwing.com/problem/content/description/4264/

题目

Farmer John 最近购入了 N 头新的奶牛,每头奶牛的品种是更赛牛(Guernsey)或荷斯坦牛(Holstein)之一。

奶牛目前排成一排,Farmer John 想要为每个连续不少于三头奶牛的序列拍摄一张照片。

然而,他不想拍摄这样的照片,其中只有一头牛的品种是更赛牛,或者只有一头牛的品种是荷斯坦牛——他认为这头奇特的牛会感到孤立和不自然。

在为每个连续不少于三头奶牛的序列拍摄了一张照片后,他把所有「孤独的」照片,即其中只有一头更赛牛或荷斯坦奶牛的照片,都扔掉了。

给定奶牛的排列方式,请帮助 Farmer John 求出他会扔掉多少张孤独的照片。

如果两张照片以不同位置的奶牛开始或结束,则认为它们是不同的。

输入格式
输入的第一行包含 N。

输入的第二行包含一个长为 N 的字符串。如果队伍中的第 i 头奶牛是更赛牛,则字符串的第 i 个字符为 G。否则,第 i 头奶牛是荷斯坦牛,该字符为 H。

输出格式
输出 Farmer John 会扔掉的孤独的照片数量。

数据范围
3≤N≤5×105
输入样例:
5
GHGHG
输出样例:
3
样例解释
这个例子中的每一个长为 3 的子串均恰好包含一头更赛牛或荷斯坦牛——所以这些子串表示孤独的照片,并会被 Farmer John 扔掉。

所有更长的子串(GHGH、HGHG 和 GHGHG)都可以被接受。

我的超时代码 过了11/12的数据

/**
 * 2023年1月12日15:04:41——2023年1月12日16:08:20
 二分类,那用0和1分别表示G 和 H,用前缀和的思想做!
 * 灵光乍现
 * 时间复杂度为:O(N*N) 10次方量级,超时啦,但是这是目前想到最优的了
 * 结果:通过11/12的数据  哈哈  还行
 * 
 * 再思考一下怎么优化!
 * 2023年1月12日16:08:27——
 */
 
#include <iostream>

using namespace std;

const int N = 5 * 1e5 + 10;

char c;
int a[N], s[N];   // a是0 1数组,s是前缀和数组下标从1开始,为了省去特判

int main()
{
    int n;
    scanf("%d", &n);
    scanf("%c", &c);    // 吃缓冲区的回车
    for (int i = 0; i < n; i ++ ) 
    {
        scanf("%c", &c);
        if (c == 'H') a[i + 1] = 1;
        else a[i + 1] = 0;
    }
    // 计算数组a的前缀和,O(N)
    for (int i = 1; i <= n; i ++ ) s[i] = s[i - 1] + a[i];
    
    // 测试开始
    // for (int i = 1; i <= n; i ++ ) cout << a[i] << " ";
    // cout << endl;
    // for (int i = 1; i <= n; i ++ ) cout << s[i] << " ";
    // 测试结束
    
    long long cnt = 0;
    // 遍历长度为3,4,5,,,n
    for (int len = 3; len <= n; len ++ ) 
    {
        for (int i = 1; i + len - 1 <= n; i ++ )
        {
            int sum_sequence = s[i + len - 1] - s[i - 1];  // 从i这个起点开始的长度为len的序列和为sum_sequence
            int cnt_H = sum_sequence, cnt_G = len - cnt_H;  // H的个数就是1的个数,G的个数是剩余的
            if (cnt_H == 1 || cnt_G == 1) cnt ++ ;
        }
    }
    printf("%lld\n", cnt);
    
    return 0;
}

听完Y总讲解之后

思路

总的思路:枚举只包含一个孤独字母的连续序列,就能不重不漏。
枚举:
情况1——第0头牛当孤独牛,有几张孤独照片
情况2——第1头…
情况3——第2头…
情况4——第3头…

求和上述情况。
在这里插入图片描述
注:图片来自AcWing
注:L和R必须是连续出现的H 的个数,碰到H就要停止,因为不连续就会引入新的G,导致G的个数大于1个啦,G就不孤独了,G就有小伙伴G了

一开始理解错了,噌噌噌写了一堆,然后Wrong Answer哈哈。
看了一下题解,知道错在哪了(/捂脸)

l数组:表示当前位置左边有连续的几个异类牛
r:右边,同上

代码2

自己理解完的AC代码,缺点是找左右的异类牛数目需要循环,太慢,但是第12个50000的数据倒是过了

#include <iostream>

using namespace std;

const int N = 5*1e6 + 10;

char c[N];

int main()
{
    int n;
    scanf("%d", &n);
    scanf("%c", &c);    // 吃缓冲区的回车
    for (int i = 0; i < n; i ++ ) scanf("%c", &c[i]);
    
    long long int ans = 0;
    for (int i = 0; i < n; i ++ ) 
    {
        // 往左走,有几个连续的 不同种类的牛牛
        int cnt_left = 0;
        for (int l = i - 1; l >= 0; l -- ) 
        {
            if (c[l] == c[i]) break;    // 碰到同类牛牛,跳出循环,不连续了
            else cnt_left ++ ;  // 不同类牛牛,加上
        }
        
        // 往右走,有几个连续的 不同种类的牛牛
        int cnt_right = 0;
        for (int r = i + 1; r < n; r ++ ) 
        {
            if (c[r] == c[i]) break;    // 碰到同类牛牛,跳出循环,不连续了
            else cnt_right ++ ;  // 不同类牛牛,加上
        }
        
        // 统计个数
        ans =  ans + max(cnt_right-1, 0) + max(cnt_left-1, 0) + ((long long)cnt_right * (long long)cnt_left);
        
        // cout << i << "   这是一个循环   " << ans << endl;
    }
    
    printf("%lld\n", ans);
    
    return 0;
}

代码 3 Y总的思路

用y总思路的L[ ]数组和R[ ]数组

L数组是什么?L[i] :第i头牛左侧的连续异类牛个数
R数组同理,第i头牛右侧的连续异类牛个数。

得到L R数组即可,分别需要一层循环。

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

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

相关文章

论文解读12——NGBoost: Natural Gradient Boosting for Probabilistic Prediction

目录1、文章贡献2、评分规则3、自然梯度4、自然梯度提升算法NGBoost1、文章贡献 由吴恩达团队提出的NGBoost是一种通过梯度提升进行概率预测的算法&#xff0c;与经典的回归模型返回一个点估计结果不同&#xff0c;概率回归模型返回全概率分布&#xff0c;将条件分布的参数视为…

Windows系统安装jenkins服务 war包形式

1.首先下载 jenkins war包 注意和jdk 的版本匹配 https://www.jenkins.io/zh/download/ 2.配置jenkins环境变量 如果不配置环境变量, jenkins的主目录默认生成在c盘下 环境变量怎么配? 请自行百度 3.运行jar包 注意修改war包路径 java -jar /data/jenkins/jenkins.war…

DNS原理与搭建(一)

文章目录一、DNS的概念与原理二、DNS私服搭建一、DNS的概念与原理 概念 DNS指的是域名服务器&#xff0c;就是将域名转换成IP[或者将IP转换成域名];当我们在浏览器中输入域名并按下回车&#xff0c;会对我们输入的域名进行解析&#xff0c;并返回一个IP地址&#xff0c;在通过…

Deepin系统深度学习环境配置指南

Deepin深度操作系统在众多Linux发行版本中深受欢迎&#xff0c;在实用性和专业方面到达了很好的均衡&#xff0c;该系统软件适配丰富支持很多第三方软件&#xff0c;增加了系统任务的灵活性。在装好该系统后&#xff0c;如何在该系统上进行深度学习代码训练调试&#xff0c;这就…

网络编程.

文章目录一、概述通信要素一&#xff1a;IP和端口号IP端口号通信要素二&#xff1a;网络协议TCP网络编程UDP网络编程URL网络编程每日一考一、概述 1、网络编程中两个主要问题&#xff1a; 如何定位网上的一台或多台主机&#xff0c;定位主机上的特定应用 找到主机后&#xff0…

北京化工大学1/17寒假集训题解(>1800)

目录 A - 文艺平衡树 B - 可持久化文艺平衡树 C - 可持久化平衡树 主要思路&#xff1a;FHQ Treap 可持久化 D - 维护数列 初始化 Insert操作 Delete操作 Reverse操作 Make-Same操作 Get-Sum操作 Max-Sum操作 懒标记的处理 E - 文本编辑器 A - 文艺平衡树 这里的…

贪心策略(二)兑换零钱(最后还得是动规)

兑换零钱(一)_牛客题霸_牛客网 兑换零钱(二)_牛客题霸_牛客网 兑换零钱(一)_牛客题霸_牛客网 描述 给定数组arr&#xff0c;arr中所有的值都为正整数且不重复。每个值代表一种面值的货币&#xff0c;每种面值的货币可以使用任意张&#xff0c;再给定一个aim&#xff0c;代表要…

C++程序设计——类和对象II

一、再谈构造函数 1.构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量赋一个合适的初始值。 虽然上述构造函数调用后&#xff0c;对象中已经有了初始值&#xff0c;但是不能将其称之为类对象成员的初始化&#xff0c;构造函数…

Vue学习笔记(三)

Vue学习笔记三1.组件的引入及使用2.插槽3. 插槽三种写法3.1 第一种3.2 第二种3.3 第三种简化写法4.组件生命周期4.Vue路由1.组件的引入及使用 在components中写入组件Header.vue 在App.vue中进行引入 <template><div><!-- 组件化: 1个页面由不同的部分组合而…

excel日期函数:DATEDIF的几个实际应用公式编写

DATEDIF函数不仅可以用来计算年龄、工龄、工龄工资、项目周期&#xff0c;还可以用来做生日倒计时提醒&#xff0c;项目竣工日倒计时提醒等等。用上它&#xff0c;您再也不会缺席那些重要的日子&#xff0c;不论是亲人生日、项目竣工日&#xff0c;还是儿女的毕业典礼日。DATED…

明道云大湾区2023年季度闭门会议圆满结束

2023年1月12日&#xff0c;明道云在深圳坂田天安云谷召开明道云大湾区2023年季度闭门分享会。超过百位来自中大型企业组织的IT部门代表和业务技术专家莅临现场&#xff0c;进行了一下午的同台交流。广汽本田、深圳龙华区人民医院、民生银行及华润置地的项目代表&#xff0c;深度…

WebService最优方案选择

需求 最近&#xff0c;接触到了一个java对接C#的项目&#xff0c;使用WebService技术开发。项目已经快告一段落了&#xff0c;经过这几个月接触和使用。我有了一个清晰的认识&#xff0c;之前也调研了互联网上大部分实现的通讯&#xff0c;他们的优缺点&#xff0c;我都有一定…

linux系统下如何获取文件的创建时间

linux 获取文件的创建时间 提到获取文件的创建时间&#xff0c;写Java的小伙伴可能会说&#xff0c;那太简单了&#xff0c;java.nio.file.attribute.BasicFileAttributes下这个类不就记录了文件的相关信息吗&#xff0c;比如下面这段代码不就得到文件的创建时间了嘛&#xff…

chrono_CLOCK(二)

chrono_CLOCK&#xff08;二&#xff09; 文章目录chrono_CLOCK&#xff08;二&#xff09;从测量C程序运行时间引入C风格C风格时钟的成员和源码分析成员函数成员变量Clock提供的操作例子三个clock区别例子三个clock的精度问题方式一方式二从测量C程序运行时间引入 C风格 在C…

数据库,计算机网络、操作系统刷题笔记33

数据库&#xff0c;计算机网络、操作系统刷题笔记33 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

自定义View的学习笔记1-1

这一系列主要是跟随扔物线的学习笔记。 自定义View主要是三个部分&#xff0c;绘制&#xff0c;布局&#xff0c;触摸反馈。 绘制是这三个部分中&#xff0c;最重要的一个。 先说绘制&#xff0c;所谓绘制&#xff0c;指的就是控件内容的显示。啥意思&#xff0c;比如我们作…

02 技术太卷我学Apex-级联值列表

02 技术太卷我学Apex-级联值列表 0 值列表概念 就是页面输入时从下拉列表中选择固定值。 值列表可以在APEX中【共享组件】-【其它组件】-【值列表】创建&#xff0c;也可以也页面上自己用sql语句&#xff08;一般需要级联值列表最好在页面上创建&#xff09;创建。 1 创建一…

Node版本锁定

Node版本锁定问题方案一、锁定Node版本二、自动切换Node版本问题 接手项目时&#xff0c;不知道项目所用的Node版本同一个项目&#xff0c;不同人用不同的Node版本&#xff0c;引起编译后的未知问题 方案 一、锁定Node版本 在package.json中配置 engines&#xff0c;限定项目…

【微电网】基于改进粒子群算法的微电网优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

云原生周刊 | 使用 ChatGPT 协助解决 Prometheus 告警

开源项目推荐 kubernetes-chatgpt-bot 这是一个适用于 Slack 的 ChatGPT 机器人&#xff0c;只要有监控告警发送到 Slack 频道中&#xff0c;你就可以通过机器人向 ChatGPT 咨询如何解决这个告警&#xff0c;ChatGPT 将会给出一个较为详细的解决方案。 Copacetic Copacetic …