牛客周赛 Round 34(A,B,C,D,E,F,G)

把这场忘了。。官方也迟迟不发题解

比赛链接

出题人题解


A 小红的字符串生成

思路:

枚举四种字符串打印出来即可,为了防止重复可以用set先去一下重。

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
using namespace std;set<string> S;
string a,b;int main(){cin>>a>>b;S.insert(a);S.insert(b);S.insert(a+b);S.insert(b+a);cout<<S.size()<<endl;for(auto x:S)cout<<x<<endl;return 0;
}

B 小红的非排列构造

思路:

如果它本身就不是一个排列,那么就不需要修改,如果是排列,我们就换一个不是排列中的数进去,那么它就一定不是排列了。

判定是否为排列的方法很多,我是先排序再去重,然后看一下两头的数是不是1和n就行了

code:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1e5+5;int n,a[maxn],cnt;int main(){cin>>n;for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+n+1);cnt=unique(a+1,a+n+1)-a-1;if(cnt==n && a[1]==1 && a[n]==n)printf("1\n1 1000000");else printf("0");return 0;
}

C 小红的数字拆解

思路:

看半天没看懂,原来是切割数位啊😅

观察一下不难发现,如果想要切割出来的数是个偶数,那么就需要个数为偶数,高位无所谓。而我们要尽可能切出来最多偶数,所以奇数一定和和它右边遇到的第一个偶数进行结合。

切割方法找到了,现在问题变成了怎么存,怎么排序。一般想法是用string存,并用string内置的排序办法。但是string排序默认是字典序排序而不是数字的先比数位。于是用结构体存一个string,并重载一下排序办法就可以了。

code:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>
#include <string>
using namespace std;string str,t;
struct Str{string s;Str(string x):s(x){};bool operator<(const Str x)const{if(s.size()==x.s.size())return s<x.s;return s.size()<x.s.size();}
};
multiset<Str> S;int main(){cin>>str;for(auto x:str){t+=x;if(~(x-'0')&1){S.insert(Str(t));t.clear();}}for(auto x:S)cout<<x.s<<endl;return 0;
}

D 小红的陡峭值

思路:

手玩一会不难发现:中间的 0 0 0 都是没用的。

如果中间的 0 0 0 都取两边其一的数,那么中间的 0 0 0 就可以看作没有。而如果都不取,差值势必大于1,直接就不满足条件了。因此为了满足条件,中间的 0 0 0 就只能取一边的数,就相当于没用。

现在有用的只有两端的 0 0 0。我们用两个 b o o l bool bool 变量 f 1 , f 2 f1,f2 f1,f2 记录一下开头和结尾有无 0 0 0,然后直接把原序列中所有的 0 0 0 全部去掉(或者直接先替换成一端的数)。问题变成了现在要如何填数?

发现需要求一下中间的数的陡峭值是多少,如果是 0 0 0,就需要两端的 0 0 0 来补,如果是 1 1 1,就不需要两端有 0 0 0,如果大于 1 1 1,直接无解。

code:

#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=1e5+5;int n,a[maxn],cnt;int main(){cin>>n;if(n==1){printf("-1");return 0;}int flag=0;for(int i=1,t;i<=n;i++){cin>>a[i];if(a[i]==0){if(i==1)flag=1;else if(i==n)flag=2;//两端有一端有就行了,所以用了一个变量a[i]=a[i-1];}}if(a[n]==0)a[n]=5;for(int i=n;i>=1;i--)if(a[i]==0)a[i]=a[i+1];int tot=0;for(int i=2;i<=n;i++)tot+=abs(a[i]-a[i-1]);if(tot==0 && flag){if(flag==1)a[1]=(a[2]==1)?2:a[2]-1;else if(flag==2)a[n]=(a[n-1]==1)?2:a[n-1]-1;for(int i=1;i<=n;i++)printf("%d ",a[i]);}else if(tot==1){for(int i=1;i<=n;i++)printf("%d ",a[i]);}else printf("-1");return 0;
}

E 小红的树形 dp

思路:

一开始的思路是:把一个点钦定为根节点,那么每个点的深度就确定了,如果某个点的值确定,那么对应奇数和偶数深度的点就确定了,然后巴拉巴拉。

不过不用那么麻烦,因为一个点确定了,其他点就随之确定了,因此我们直接遍历一下有没有d或p,如果有,就以它为根节点开始往下填数,如果出现了冲突的点就无解。如果没有d或p,就随便填了。

code:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1e5+5;int n;
string color;int head[maxn],cnt;
struct edge{int v,nxt;
}e[maxn<<1];
void add(int u,int v){e[++cnt].v=v;e[cnt].nxt=head[u];head[u]=cnt;
}void dfs(int u,int rt){for(int i=head[u],v;i;i=e[i].nxt){v=e[i].v;if(v==rt)continue;if(color[v]==color[u]){printf("-1");exit(0);}color[v]=(color[u]=='d')?'p':'d';dfs(v,u);}
}int main(){cin>>n>>color;color=" "+color;for(int i=1,u,v;i<n;i++){cin>>u>>v;add(u,v);add(v,u);}if(color.find_first_of("dp",1)!=string::npos)dfs(color.find_first_of("dp",1),-1);else {color[1]='d';dfs(1,-1);}cout<<color.substr(1);return 0;
}

F 小红的矩阵构造

思路:

就是很固定的构造方式,官方讲解讲的已经很明白了,在视频一小时九分那里。大概就是这个样子:

在这里插入图片描述

注意 n , m ≥ 4 n,m\ge 4 n,m4 x x x 是偶数。

code:

#include <iostream>
#include <cstdio>
using namespace std;int n,m,x;
int a[5][5];int main(){cin>>n>>m>>x;if(x==2)cout<<-1<<endl;else if(x%4==0){a[1][1]=a[1][2]=a[2][1]=a[2][2]=x/4;for(int i=1;i<=n;i++,puts(""))for(int j=1;j<=m;j++){if(i>4 || j>4)printf("0 ");else printf("%d ",a[i][j]);}}else {x-=6;a[1][1]=a[1][2]=a[2][1]=a[2][2]=x/4;a[3][2]=a[2][3]=a[3][3]=a[2][4]=a[4][2]=a[4][4]=1;for(int i=1;i<=n;i++,puts(""))for(int j=1;j<=m;j++){if(i>4 || j>4)printf("0 ");else printf("%d ",a[i][j]);}}return 0;
}

G 小红的元素交换

思路:

用到了置换环这个小知识点。将排列打乱,然后给 a i → i a_i\rightarrow i aii 连一条边,连完之后就会出现多个环,只出现环的原因是:如果将每个位置看作一个点,每个点都只有一个入度和一个出度。而且环上每个位置上的数的正确位置都是它指向的下一个位置(废话),也就是环上每个位置的数都只偏移了一位。

根据这个思路,可以把问题转化为,多个置换环怎么把数归位。假设环长为 a a a,发现如果环中两种颜色都存在,那么它可以通过交换 a − 1 a-1 a1 次把所有数归位。

归位方法是:环上每一段连续的白色或黑色的最后一个标记一下,都先不动,然后从中随便取一个开始向后给路上的每个点进行归位,然后遇到下一个被标记的点,让它接着向下交换,换一遍后剩下的就是黑白黑白颜色交替的颜色没有归位了,再随便找一个,把它和在它的正确位置上的点交换位置(因为是黑白交替,它下一个位置的点一定和它颜色不同,所以一定是可以交换的),然后换出来的点以此类推和正确位置上的点交换,最后就能换好,因为每次交换都会有一个点被放入正确位置,而最后一次交换两个点会同时归位,所以一共需要 a − 1 a-1 a1 次交换。

如果是纯色的环,就需要在别处借一个异色过来,然后再还回去,这就需要 a + 1 a+1 a+1 次交换。

但是如果有两个不同纯色的环,它们可以先交换其中一个点,两边都排好序后再换回来,这样两边都只需要 a a a 次交换就可以了。

所以这个题我们需要统计每个环是同色还是异色,如果是异色就加 环长 − 1 环长-1 环长1,否则加 环长 + 1 环长+1 环长+1。再统计纯黑和纯白分别有几个,最后再减去两值小的*2就行了。啊嘞,好像不是黑色是红色

code:

#include <iostream>
#include <cstdio>
#include <set>
#include <cstring>
#include <vector>
using namespace std;
const int maxn=1e5+5;int n,a[maxn];
string color;int main(){cin>>n;for(int i=1;i<=n;i++)cin>>a[i];cin>>color;color=" "+color;int ans=0,w=0,r=0;vector<bool> vis(n+5,false);for(int i=1;i<=n;i++){int cnt=0;bool f1=false,f2=false;//有红 有白 if(!vis[i]){vis[i]=true;cnt++;if(color[i]=='W')f1=true;else f2=true;for(int p=a[i];p!=i;p=a[p]){vis[p]=true;cnt++;if(color[p]=='W')f1=true;else f2=true;}if(cnt==1)continue;else if(f1 && f2)ans+=cnt-1;else {ans+=cnt+1;if(f1)w++;else r++;}}}if(ans==0)cout<<0<<endl;else if(color.find("W")==string::npos || color.find("R")==string::npos)cout<<-1<<endl;else cout<<ans-min(w,r)*2<<endl;return 0;
}

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

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

相关文章

day48 ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

一遍过。 当前房屋偷与不偷取决于 前一个房屋和前两个房屋是否被偷了。所以这里就更感觉到&#xff0c;当前状态和前面状态会有一种依赖关系&#xff0c;那么这种依赖关系都是动规的递推公式。 class Solution { public:int rob(vector<int>& nums) {vector<vec…

门店纵深不足、入口有遮挡影响客流准确率?近景客流帮你搞定!

为了优化运营策略、提升门店营收&#xff0c;很多店铺和商场都会安装客流摄像机。但是在实际应用中&#xff0c;由于门店纵深受限等原因&#xff0c;导致无法使用之前的常规客流产品。 针对这种情况&#xff0c;悠络客最新研发了近景客流产品&#xff0c;即使存在入口被遮挡或门…

内网信息搜集

目录 内网基础知识 基本流程图 怎么判断是否在域内 常规信息类收集-应用&服务&权限等 cs信息搜集 bloodhound安装及使用 内网基础知识 工作组&#xff1a;将不同的计算机按照功能分别列入不同的组&#xff0c;想要访问某个部门的资源&#xff0c;只要在【网络】里…

pyqt教程

一、组件安装配置 1.安装组件 在Anaconda Prompt下进入自己的python环境 pip install PyQt5 pip install PyQt5-tools 2.vscode安装插件 3.配置路径 配置Pyuic:Cmd与Qtdesigner:Path路径 1.Pyuic:Cmd路径 一般是在你安装的python环境下的 \Scripts\pyuic5.exe 2.Qtdesigner:P…

anaconda简介以及安装(Windows)

介绍 Anaconda是一个开源的Python发行版本&#xff0c;它是一个打包的集合&#xff0c;里面预装了conda、Python、众多packages、科学计算工具等。Anaconda的目的是方便使用Python进行数据科学研究&#xff0c;它涵盖了数据科学领域常见的Python库&#xff0c;并且自带了专门用…

Python的循环结构练习

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 生命对某些人来说是美丽的&#xff0c…

我国每年研究生的毕业数量统计分享

本数据集详细记录了自1949年至2021年我国每年研究生的毕业数量&#xff08;包括硕士和博士学位的毕业生&#xff09;。在2021年&#xff0c;我国的研究生毕业生人数达到了772,761人&#xff0c;此数字比上一年度增加了44,000人。 统计的数据单位使用的是人数。 数据展示&…

mysql,for循环执行sql

遇到一个问题&#xff0c;我需要模拟上百万数据来优化sql&#xff0c;线上数据down不下来&#xff0c;测试库又没有&#xff0c;写代码执行要么慢要么就是sql语句太长。 于是&#xff0c;直接用mysql自带的功能去实现&#xff01; 简单而简单 mysql可以for循环&#xff1f;没…

Laravel框架: Call to a member function connect() on null 异常报错处理

Laravel框架&#xff1a; Call to a member function connect() on null 异常报错处理 Date: 2024.03.01 21:03:11 author: lijianzhan 原文链接: https://learnku.com/laravel/t/63721 问题&#xff1a; local.ERROR: Call to a member function connect() on null {"…

【前端素材】推荐优质后台管理系统 Greeva平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理网站、应用程序或系统的管理界面&#xff0c;通常由管理员和工作人员使用。它提供了访问和控制网站或应用程序后台功能的工具和界面&#xff0c;使其能够管理用户、内容、数据和其他各种功能。 2、功能需求 后台管理系…

使用mininet快速入门ONOS路由交换技术与原理-路由篇

上篇文章 《使用mininet快速入门ONOS路由交换技术与原理-交换篇》 使用mininet搭建了一个简单的网络拓扑&#xff0c;并实现了同一交换机下同网段多主机的通信&#xff0c;其中涉及到的通信知识主要以二层mac地址通信为主。 但在芸芸网络的世界中&#xff0c;主机间的通信除了…

【C++】数组、函数、指针

文章目录 1.数组1.1一维数组1.2二维数组 2.函数3.指针&#xff1a;可以通过指针间接访问内存(指针记录地址&#xff09;3.1 指针的定义和使用3.2 指针所占用空间3.3 空指针和野指针3.4 const修饰指针3.5指针和数组3.6指针和函数3.7练习&#xff08;指针、数组、函数&#xff09…

综合练习(二)

目录 列出薪金比 SMITH 或 ALLEN 多的所有员工的编号、姓名、部门名称、领导姓名、部门人数&#xff0c;以及所在部门的平均工资、最高和最低工资 补充 spool Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 列出薪金比 SMITH 或 AL…

STM32USART串口数据包

文章目录 前言一、介绍部分数据包两种包装方式&#xff08;分割数据&#xff09;HEX数据包文本数据包 数据包的收发流程数据包的发送数据包的接收固定包长的hex数据包接收可变包长的文本数据包接收 二、实例部分固定包长的hex数据包接收连接线路代码实现 可变包长的文本数据包接…

【InternLM 实战营笔记】基于 InternLM 和 LangChain 搭建你的知识库

准备环境 bash /root/share/install_conda_env_internlm_base.sh InternLM升级PIP # 升级pip python -m pip install --upgrade pippip install modelscope1.9.5 pip install transformers4.35.2 pip install streamlit1.24.0 pip install sentencepiece0.1.99 pip install a…

MySQL 多表查询 连接查询 外连接

介绍 MySQL 多表查询 连接查询 内连接 外连接分为两种&#xff0c;左外和右外连接&#xff0c; 左外&#xff1a;相当于查询表1(左表)的所有数据 包含 表1和表2交集部分的数据,完全包含左表的数据 右外&#xff1a;相当于查询表2(右表)的所有数据 包含 表1和表2交集部分的数据…

比特币暴涨逼近历史最高点;阿里云全线降价20%丨 RTE 开发者日报 Vol.155

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

C++的晨曦之旅:开启编程的新篇章

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、 命名空间 在 C/C 中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0…

div在vue的组件之中如何设置这个字体的颜色和样式大小

在Vue组件中设置<div>的字体颜色和样式大小可以通过两种主要方式实现&#xff1a;通过内联样式&#xff08;inline styles&#xff09;或者通过CSS类&#xff08;CSS classes&#xff09;。 使用内联样式 在Vue模板中直接在元素上使用style属性来设置样式。这种方法适用…

Android Shadow插件化框架分析与集成(一)

一、shadow源码导入及分析 1、下载项目源码 2、导入到Android studio 3、设置jdk及sdk版本 包/应用描述类型sample-constant公共字符串常量libsample-host宿主应用applicationsample-host-lib宿主应用依赖包libsample-manager是插件管理器的动态实现,主要负责加载插件和安装…