Codeforces Round #848 (Div. 2)A-C

news2025/7/31 18:32:06

传送门

目录

A. Flip Flop Sum

 代码:

B. The Forbidden Permutation

代码:

C. Flexible String

 代码:


A. Flip Flop Sum

题意:给你一个长度为n的数组(数组元素只为1或者-1),你要且只能进行一次操作:对于所有i(1<=i<n),使a_i=-a_i,a_i+_1=-a_i+_1,问你数组的最大和为多少.

思路:首先把所有元素和累加起来,然后直接遍历走一遍看存不存在两个相邻的负数,如果存在就把结果+4直接输出,否则去寻找是否存在一个负数,因为如果存在一个负数的时候结果并不会改变直接输出即可,否则就说明全部都是负数,那么就要输出res-4,

 代码:

void slove( )
{
	sc_int(n);
    int res=0;
    bool st=0;
	for(int i =1;i<=n;i++)
	{
        sc_int(s[i]);
        res+=s[i];
        if(s[i]==-1)st=1;
	}
    for(int i =1;i<n;i++)
    {
            if(s[i+1]==-1&&s[i]==-1){
            cout<<res+4<<endl;
            return ;
            }
    }
    if(!st)res-=4;
    cout<<res<<endl;
}

 

B. The Forbidden Permutation

题意:给你一个长度为n的排列,定义pos(x)为x在排列中的下标

然后对于给出的m个元素,如果存在一个序列i(1<=i<m )

,使pos(a_i)>pos(a_i+_1)或者pos(a_i+_1)>pos(a_i)+d,那么就说明它的好的

现在给你一个操作,可以使排列中的两个相邻元素交换。问你在可以保证能够使这个序列是好的的情况下,问你需要交换的最小次数是多少(可以是0)

思路 :对于每一个元素,如果要使它为好的,那么只有两种情况:a_i+_1的下标挪到a_i的左边,或者a_i+_1的下标和a_i的下标相差d+1,然后暴力取最小值就可。

代码:

void slove( )
{
	int p;
	cin>>n>>m>>p;
    map<int,int>q;
	for(int i =1;i<=n;i++)
	{
        int x;
        sc_int(x);
        q[x]=i;
	}
    for(int i =1;i<=m;i++)sc_int(s[i]);
    int res=1e9;

    for(int i =1;i<m;i++)
    {
        int a=q[s[i]],b=q[s[i+1]];
        res=min(res,b-a);
        if(b-a<=p)
        {
        if(p<n-1)
        res=min(res,p-(b-a)+1);
        }
        else res=0;
    }
    res=max(res,0);
    cout<<res<<endl;
	return ;
}

 

C. Flexible String

题意:给你两个长度为n的英文字符串a,b和一个k(字符串中最多存在10种小写字母),你可以进行某次操作任意次:

使a串中的某一个字符存到一个容器Q中,同时这个字符替换成任意一个字符。但是容器中的字符中不能存在超过k种字符。

然后问你对于l,r(1<=l<=r<=n),问你有多少对(l,r),满足a[i]=b[i],(l<=i<=r).

思路: 因为a字符串中最多有10中小写字母 ,那么可以直接把这10(也有可能小于10)种字符串存入数组中,然后用dfs遍历所有的k种字符存入Q的情况,然后计算直接取最大值即可,

时间复杂度最大也就O(n*(sqrt(2,10)),刚好1e8不会超时。

 代码:


#include<cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include<vector>
#include<queue>
#include<map>
#define sc_int(x) scanf("%d", &x)
#define sc_ll(x) scanf("%lld", &x)
#define pr_ll(x) printf("%lld", x)
#define pr_ll_n(x) printf("%lld\n", x)
#define pr_int_n(x) printf("%d\n", x)
#define ll long long 
using namespace std;

const int N=1000000+100;
int n ,m,h,Time,k;
char a[N],b[N],c[12];
map<int,int>q;
ll ress;

void init()
{
    for(int i =1;i<=n;i++) a[i]=b[i]=0;
    for(int i ='a';i<='z';i++)q[i]=0;
    for(int i =1;i<=11;i++)c[i]=0;
}

void  cal()
{
    ll res=0,sum=0;
    int l=0,r=0;
    for(int i =1;i<=n;i++)
    {
        if(a[i]==b[i]||q[a[i]]){
            if(!l){l=i;r=i;}
            else r++;
        }
        else if(l) {
            sum=r-l+1;
            res+=sum*(sum+1)/2;//这边可以计算一下,对于l,r  (l,r)=(r-l+1)*(r-l+1)/2
            r=l=0;//更新
        }
    }
    sum=r-l+1;
    if(l)res+=sum*(sum+1)/2;  
   ress=max(res,ress);
}   

void dfs(int i, int x )//i是dfs到了当前位置,x是标记了x个元素
{
    if(x==min(Time,k)){//如果所有元素都被标记到了或者到了限制
        cal();
        return ;
    }
    i++;
    for( i ; i <= Time ; i++)
    {
        q[c[i]]=1;
        dfs(i,x+1);
        q[c[i]]=0;        
    }

    return ;
}

void slove( )
{
    ress=0;
    Time=0;
	sc_int(n),cin>>k;
    cin>>a+1>>b+1;
    for(int i =1;i<=n;i++)    
    {
        if(!q[a[i]]){//寻找第一次出现的字符
            c[++Time]=a[i];
            q[a[i]]=1;
        }
    }
    for(int i ='a';i<='z';i++)
    q[i]=0;//map用两次先初始化一下

    if(k==0){//k为0直接计算
    cal();
    cout<<ress<<endl;
    init();
    return ;
    }
    for(int i =1;i<=Time;i++)//开始dfs
    {
        q[c[i]]=1;
        dfs(i,1);
        q[c[i]]=0;
    }
	cout<<ress;
	cout<<endl;
    init();//结束后初始化
}

int main()
{
	int t;
	sc_int(t);
	while(t--)
	slove();


	return 0;
}

总结:A题做的有点粗心,脑翻以为是至少一次(结果是只要一次),b题意度太久了,c思路是对的,但是小细节有些问题,以至于卡在一个地方卡了1个钟,最后还是凑巧用另一种方法ac后反着来找bug找到的,只能说还要继续训练了。

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

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

相关文章

掌握lombok简化Java编码完成后端提效

Lombok安装 –>添加依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.16</version><scope>provided</scope> </dependency>scopeprovided&#xff0c;说…

LinkSLA智能运维技术派-Redis的监控

Redis是一个开源&#xff0c;内存存储的数据服务器&#xff0c;可用作数据库、高速缓存和消息队列代理等场景。 首先我们对内存进行监控&#xff0c;主要指标如下&#xff1a; - used_memory:使用内存 - used_memory_rss:从操作系统分配的内存 - mem_fragmentation_ratio:内…

如何成为一名黑客?小白必学的6个基本步骤

黑客攻防是一个极具魅力的技术领域&#xff0c;但成为一名黑客毫无疑问也并不容易。你必须拥有对新技术的好奇心和积极的学习态度&#xff0c;具备很深的计算机系统、编程语言和操作系统知识&#xff0c;并乐意不断地去学习和进步。 如果你想成为一名优秀的黑客&#xff0c;下…

交叉编译 acl

交叉编译 acl 概述 访问控制列表&#xff08;Access Control Lists&#xff0c;ACL&#xff09;是应用在路由器接口的指令列表。在 Linux 系统中&#xff0c;ACL 用于设定用户针对文件的权限&#xff0c;而不是在交换路由器中用来控制数据访问的功能&#xff08;类似于防火墙…

跑步耳机怎么选、最好用的跑步专用耳机分享

跑步时候戴着的耳机一直往下滑&#xff0c;跑步的步伐也不敢快起来&#xff0c;生怕耳机掉下去。除此之外&#xff0c;还担心跑步时流的汗水渗入到耳机里面&#xff0c;生怕因此被电到。因为没有合适的耳机在跑步时听歌&#xff0c;不但没能缓解跑步时的枯燥还徒增了些烦恼&…

力扣-市场分析

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1158. 市场分析二、解题1.错误示范①提交SQL运行结果2.正确示范①提交SQL运行结果3.错误示范②提交SQL运行结果4.正确示范②提交SQL运行结果5.其他总结前…

华为OD机试题,用 Java 解【查找接口成功率最优时间段】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

Allegro如何在关闭飞线模式下查看网络连接位置操作指导

Allegro如何在关闭飞线模式下查看网络连接位置操作指导 在用Allegro做PCB设计的时候,有时会因为设计需要,关闭飞线显示。 如何在关闭飞线显示模式下查看网络连接的位置,如下图 除了能看到网络连接的点位以外,还能看到器件的pin Number 如何显示出这种效果,具体操作如下 …

代码随想录算法训练营 || 回溯算法 491 46 47

Day25491.递增子序列力扣题目链接给定一个整型数组, 你的任务是找到所有该数组的递增子序列&#xff0c;递增子序列的长度至少是2。示例:输入: [4, 6, 7, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]思路有难度的一道题需要注意两个…

Google员工说出了我不敢说的心里话!

前言&#xff1a;本文来自Beyond的投稿&#xff0c;码农翻身做了修改。今天在Medium上看到一篇文章《The maze is in the mouse》&#xff0c;是一个刚从Google离职的员工写的&#xff0c;揭开了Google内部的各种问题&#xff0c;引发了很多人的共鸣&#xff0c;到目前为止&…

ChatGPT能看到图片,太神了!

闲来无事&#xff0c;给ChatGPT提供了一张图片的地址&#xff0c;他说他能看到&#xff0c;并且还描述了出来&#xff0c;真的是太神奇了。以下是对话&#xff1a; 我用Midjourney帮我生成了树世界的主界面图片了&#xff0c;很美 很好&#xff01;如果你想要分享图片&#xf…

如果不使用时钟同步工具,linux如何解决时钟同步问题?仅需要一行命令即可。

这是一篇日记&#xff0c;记录了上帝下凡出手&#xff0c;解救苍生与水火之中的神奇文章&#xff0c;如果你也有过类似的经历&#xff0c;留言关注&#xff0c;咱们交流一下~ 目录 背景&#xff08;如果不想知道可以跳过&#xff09; 一行神奇的命令 一段一段的研究 总结 背…

实现“第 24”种设计模式

传统方案 if-else 在我们编程时出现的频率&#xff0c;无需我多赘述。当逻辑复杂时&#xff0c;我们会写出很多 if-else 语句&#xff0c;于是网络上充斥着大量的相关文章&#xff0c;教我们如何去除if-else&#xff0c;大多大同小异。 归结下来&#xff0c;无非是策略模式、…

凌恩生物资讯|抗性宏基因组又一力作|抗性基因+可移动元件研究新成果!

凌恩生物合作客户&#xff1a;合肥工业大学崔康平老师团队利用凌恩生物宏基因组抗性基因研究解决方案&#xff0c;对污水处理厂活性污泥中的钆&#xff08;Gd&#xff08;III&#xff09;&#xff09;和抗生素磺胺甲噁唑&#xff08;SMX&#xff09;的联合污染情况进行了调查&a…

华为OD机试题,用 Java 解【滑动窗口最大和】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

前端无障碍适配

无障碍简介&#xff1a; 帮助一些视障群体使用手机&#xff0c;点击的热区会增加配合文字识别增加一些语音播报的功能&#xff0c;手机一般可以通过&#xff1a;设置—》辅助功能—》无障碍功能菜单 体验无障碍功能 IOS&#xff1a;设置–》辅助功能----》旁白 需求背景 会有…

Allegro如何显示层叠Options和Find操作界面

Allegro如何显示层叠Options和Find操作界面 Allegro常规有三大操作界面,层叠,Options和Find,如下图 软件第一次启动的时候,三大界面是关闭的,下面介绍如何把它们打开,具体操作步骤如下 点击菜单上的View点击Windows

JavaScript 进阶(面试必备)--charater4

文章目录前言一、深浅拷贝:one: 浅拷贝:two:深拷贝二、异常处理:one: throw 抛异常:two: try /catch 捕获异常:three:debugger三、处理thisthis指向 :one:普通函数this指向this指向 :two: 箭头函数this指向3.2 改变this:one: call():two: apply():three: bind()四、性能优化:on…

优化算法(寻优问题)

前言 群智能算法&#xff08;全局最优&#xff09;&#xff1a;模拟退火算法&#xff08;Simulated annealing&#xff0c;SA&#xff09;&#xff0c;遗传算法&#xff08;Genetic Algorithm, GA&#xff09;&#xff0c;粒子群算法&#xff08;Particle Swarm Optimization&…

前端:你不知道的async await

1.先抛出一个场景&#xff1a;你是否在日常开发中经常使用类似代码&#xff1f;async function getXXList () {const result await this.getArrListApi({page:1,id:2})this.arr result.data.listconsole.log(结果是…, this.arr)……………………其他逻辑代码 }1.1 问题那你是…