牛客周赛 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

kubernetes最新版安装单机版v1.21.5

k8s集群由Master节点和Node&#xff08;Worker&#xff09;节点组成。 1.环境 环境&#xff1a;centos 7资源配置&#xff1a;2c4g &#xff08;CPU最少2c&#xff0c;不然k8s起不来&#xff09;docker&#xff1a;25.0.3k8s&#xff1a;1.21.5 2.安装前置环境 [rootbertra…

代码随想录算法刷题训练营day28:LeetCode(93)复原IP地址 、LeetCode(78)子集 、LeetCode(90)子集II

代码随想录算法刷题训练营day28&#xff1a;LeetCode(93)复原IP地址 、LeetCode(78)子集 、LeetCode(90)子集II LeetCode(93)复原IP地址 题目 代码 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List;class Solu…

Nacos进阶

目录 Nacos支持三种配置加载方案 Namespace方案 DataID方案 Group方案 同时加载多个配置集 Nacos支持三种配置加载方案 Nacos支持“Namespacegroupdata ID”的配置解决方案。 详情见&#xff1a;Nacos config alibaba/spring-cloud-alibaba Wiki GitHub Namespace方案…

JavaScript高级程序设计

前言 《JavaScript高级程序设计》 第1章——什么是JavaScript DOM将整个页面抽象为一组分层节点。 BOM用于支持访问和操作浏览器的窗口。 第2章——HTML中的JavaScript 2.1 < script >元素 元素描述async立即开始下载脚本&#xff0c;但不能阻止其他页面动作&#…

黑马程序员Java面试专题(2)|并发编程篇(1)线程基础

指路&#x1f449; 黑马程序员Java面试专题&#xff08;1&#xff09;|常见集合篇&#xff08;1&#xff09;ArrayList&LinkedList-CSDN博客https://blog.csdn.net/YOYU_/article/details/135932520黑马程序员Java面试专题&#xff08;1&#xff09;|常见集合篇&#xff0…

RTE 开源|小红书 REDPlayer 正式发布!快来 get 同款播放器~

本项目由 RTE 开发者社区 x 小红书 联合运营 播放器最初出现在 19 世纪&#xff0c;当时主要用于播放音频&#xff0c;例如通过留声机播放唱片。 随着技术的进步&#xff0c;音频播放器不断改进&#xff0c;品质越来越好&#xff0c;体积也越来越小。到了今天&#xff0c;通过…

Vue2:用node+express写一个轻量级的后端服务

1、桌面创建demo文件夹 进入demo&#xff0c;执行如下命令 npm init输入名称&#xff1a; test_server然后一路回车 2、安装express框架 npm i express3、新建server.js 在demo文件夹中&#xff0c;新建server.js const express require(express) const app express()…

Linux——进程控制(一)进程的创建与退出

目录 一、进程创建 1.写时拷贝 2.创建多个进程 二、进程终止 1.main函数的返回值 2.bash中的$? 3.自定义退出码 4.C语言的错误码 5.错误码与退出码的区别 6.代码异常终止 7.exit函数 8.总结 一、进程创建 在之前&#xff0c;我们学过linux中的非常重要的函数——…

Fastadmin下拉选择菜单

下拉菜单效果图如下所示 对应的表字段为 cid int(11) unsigned NOT NULL DEFAULT ‘1’ COMMENT ‘分类ID 1 新手 2VIP 3基金产品’ 步骤如下&#xff1a; 一、lang/zh-cn 中找到对应的文件&#xff0c;添加 配置 二、Model 中添加方法 三、控制器中添加 四、add.html中 …

leetcode刷题(javaScript)——栈相关场景题总结

在LeetCode刷题中&#xff0c;栈是一个非常有用的数据结构&#xff0c;可以解决许多问题&#xff0c;包括但不限于以下几类问题&#xff1a; 括号匹配问题&#xff1a;例如检查括号序列是否有效、计算表达式的值等。逆波兰表达式求值&#xff1a;使用栈来实现逆波兰表达式的计算…

Python实现链表:从基础到应用

一、引言 链表是一种常见的数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含数据和指向下一个节点的指针。链表在内存中的存储不是连续的&#xff0c;这使得它在插入和删除操作上具有较高的效率。本文将使用Python语言来实现一个简单的链表&#xff0c;并展示其…

零基础学编程,中文编程工具之进度标尺构件的编程用法

零基础学编程&#xff0c;中文编程工具之进度标尺构件的编程用法 一、前言 今天给大家分享的中文编程开发语言工具 进度条构件的用法。 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载——…

力扣:35. 搜索插入位置

力扣&#xff1a;35. 搜索插入位置 描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,…

windows系统玩《模拟人生 4》 免安装版本

本文介绍如何在windows系统上玩《模拟人生 4》这个游戏&#xff0c;无需安装&#xff0c;直接玩&#xff01; 首先下载百度网盘分享的文件&#xff0c;这里下载文章末尾。 下载完成后先点击 language-change.exe 将游戏语言更改为英文&#xff0c;默认是俄语&#xff0c;根本…

sqllabs的order by注入

当我们在打开sqli-labs的46关发现其实是个表格&#xff0c;当测试sort等于123时&#xff0c;会根据列数的不同来进行排序 我们需要利用这个点来判断是否存在注入漏洞&#xff0c;通过加入asc 和desc判断页面有注入点 1、基于使用if语句盲注 如果我们配合if函数&#xff0c;表达…

B端系统:导航机制设计,用户体验提升的法宝

Hi&#xff0c;大家好&#xff0c;我是贝格前端工场&#xff0c;从事8年前端开发的老司机。很多B端系统体验不好很大一部分原因在于导航设计的不合理&#xff0c;让用户无所适从&#xff0c;大大降低了操作体验&#xff0c;本文着重分析B端系统的导航体系改如何设计&#xff0c…

[CISCN2019 华北赛区 Day2 Web1]Hack World 1 题目分析与详解

一、分析判断 进入靶机&#xff0c;主页面如图&#xff1a; 主页面提供给我们一条关键信息&#xff1a; flag值在 表flag 中的 flag列 中。 接着我们尝试输入不同的id&#xff0c;情况分别如图&#xff1a; 当id1时&#xff1a; 当id2时&#xff1a; 当id3时&#xff1a; 我…

【IO流系列】ConvertStream 转换流

转换流 1. 概述2. 作用3. 字符编码和字符集3.1 字符编码3.2 字符集 4. InputStreamReader字符转换输入流4.1 构造方法4.2 代码示例 5. OutputStreamWriter字符转换输出流5.1 构造方法5.2 代码示例 6. 练习6.1 练习1&#xff1a;转换文件编码6.2 练习2&#xff1a;读取文件数据 …

Spring 源码解析

文章目录 前言相关Spring的定义接口整体代码StartupStep contextRefresh this.applicationStartup.start("spring.context.refresh")prepareRefresh()obtainFreshBeanFactory()registerBeanPostProcessors(beanFactory)SpringAOP原码流程EnableAspectJAutoProxyAnno…

基于java+springboot女士电商平台系统源码+文档设计

基于javaspringboot女士电商平台系统源码文档设计 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源…