Codeforces 903 div3 A-F

news2024/11/24 19:54:08

A

题目分析

数据范围很小,暴力枚举即可,然后给字符串x的长度设置一个上限,我设了50,因为n*m<25,多一倍够用了

C++代码

#include<iostream>
using namespace std;
void solve(){
    int n,m;
    string x,s;
	cin>>n>>m>>x>>s;
	int cnt=0;
	while(x.size()<50){
		for(int i=0;i<x.size();i++)
			if(x[i]==s[0]&&x.size()-i>=m){
				if(x.substr(i,m)==s){
					cout<<cnt<<endl;
					return;
				}
			}
		cnt++;
		x+=x;
	}
	cout<<-1<<endl;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

B

题目分析

找三个数中的最小数,然后判断其他两个数是否是他的倍数,如果不是,直接输出no

否则直接判断要切多少次,次数大于三就不可以

C++代码

#include<iostream>
using namespace std;
int main(){
	int t;
	cin>>t;
	while(t--){
		int a,b,c;
		cin>>a>>b>>c;
		int minn=min(min(a,b),c);
		if(a%minn||b%minn||c%minn)puts("NO");
		else{
			int cnt=a/minn-1+b/minn-1+c/minn-1;
			if(cnt>3)puts("NO");
			else puts("YES");
		}
	}
	return 0;
}

题目分析

 旋转90度与原来相同,可以发现,旋转的过程中,每个数都与另外三个数相关联,如图(i,j)

与他相关联的三个位置也标出来了,直接把四个字母都变成其中最大的一个字母就可以了,然后操作数直接加上它们与最大的字母的差距

C++代码

#include<iostream>
using namespace std;
const int N=1010;
char g[N][N];
char rev[N][N];
int n;
void solve(){
	cin>>n;
	for(int i=1;i<=n;i++)scanf("%s",g[i]+1);
	int cnt=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++){
			char &v1=g[i][j],&v2=g[j][n-i+1],&v3=g[n-i+1][n-j+1],&v4=g[n-j+1][i];
			int maxx=max(max(v1,v2),max(v3,v4));
			cnt+=maxx-v1;
		}
	cout<<cnt<<endl;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

D

题目分析

每次找a[i]、a[j]、x,使得a[i]=a[i]/x,a[j]=a[j]*x

由此可见,相当于将a[i]的一个因数分给a[j]

每个数是由若干个质数的乘积组成,所以可以对每个a[i]分解质因数,然后判断每个质数出现的次数是否是n的倍数,如果是,则可以让所有数相等,否则不能

拿样例举例:

100=(2^2)*(5^2)

2=(2^1)

50=(2^1)*(5^2)

10=(2^1)*(5^1)

1无法分解质因数,不过不影响

可以发现,2一共有5次幂,5也一共有5次幂,都是n=5的倍数,每个数只需得到一个2一个5即可,即每个数都可以变成10

C++代码

#include<iostream>
#include<map>
using namespace std;
const int N=10010;
int a[N];
int n;
void solve(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	map<int,int> cnt;
	for(int i=1;i<=n;i++){
		int s=a[i];
		for(int j=2;j<=s/j;j++){//分解质因数
			if(s%j==0){
				while(s%j==0){
                    cnt[j]++;//j的次数+1
					s/=j;
				}
			}
		}
		if(s>1)cnt[s]++;
	}
	for(auto t:cnt){
		if(t.second%n!=0){
			puts("No");
			return;
		}
	}
	puts("Yes");
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

题目分析

dp[i]:从n到i最少需要删除几个数才可以变成优美序列

从后往前做一遍DP,每次遍历到一个数,有两种情况:

1、不选择该数开头的一串序列

dp[i]=dp[i+1]+1

2、选择该数开头的一串序列,即下标为i~i+a[i]的数都不能删

dp[i]=min(dp[i],dp[i+a[i]+1])

记得初始化

dp[n]=1;//只有一个数的时候只能删掉,因为a[i]至少为1,后面最少要跟着一个数

dp[n+1]=0;

C++代码

#include<iostream>
using namespace std;
const int N=200010;
int dp[N],a[N];
int n;
void solve(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	//dp[i]表示从n~i最少删除几个数 
	dp[n+1]=0; 
	dp[n]=1;//最后一个数不可能选,因为它后面没有数了 
	for(int i=n;i>=1;i--){
		//不选以a[i]为起点的一串数字,就要删掉a[i]
		dp[i]=dp[i+1]+1;
		//选以a[i]为起点的一串数字,前提是i+a[i]要小于等于n
		if(i+a[i]<=n)dp[i]=min(dp[i],dp[i+a[i]+1]); 
	}
	cout<<dp[1]<<endl;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

题目分析

换根DP

设置一个数组f[N][2]

f[i][0]:以i为根节点到任意一个被标记的点的最大距离

f[i][1]:以i为根节点到任意一个被标记的点的次大距离

dfs1(u,fa)函数由子节点更新父节点的信息

假设j是u的儿子节点,状态转移方程为:

1、f[j][0]+1>=f[u][0]:f[u][1]=f[u][0],f[u][0]=f[j][0]+1

2、f[j][0]+1>f[u][1]:f[u][1]=f[j][0]+1

dfs2(u,fa)函数由父节点更新子节点的信息

1、f[fa][0]不是由f[u][0]更新来的,则用f[fa][0]更新u:

      f[fa][0]+1>=f[u][0]:f[u][1]=f[u][0],f[u][0]=f[fa][0]+1

      f[fa][0]+1>f[u][1]:f[u][1]=f[fa][0]+1

2、f[fa][0]是由f[u][0]更新来的,则用f[fa][1]更新u:

      f[fa][1]+1>=f[u][0]:f[u][1]=f[u][0],f[u][0]=f[fa][1]+1

      f[fa][1]+1>f[u][1]:f[u][1]=f[fa][1]+1

两次dfs传入的第一个参数必须相同(1~n中的任何一个数),不然会打乱父子关系

C++代码

#include<iostream>
using namespace std;
const int N=200010,M=N*2,INF=0x3f3f3f3f;
int h[N],e[M],ne[M],idx;
int f[N][2];//f[u][0]存储以节点u为根节点的到其他点的最大值,f[u][1]存储次大值 
int n,k,ans;
void add(int a,int b){
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs1(int u,int fa){//子节点更新父节点 
    //由于初始化f为负无穷(被标记的点除外)
    //所以此时求到的最大和次大的距离就是到每个标记的点的距离
	for(int i=h[u];i!=-1;i=ne[i]){
		int j=e[i];
		if(j==fa)continue;
		dfs1(j,u);
		if(f[j][0]+1>=f[u][0])f[u][1]=f[u][0],f[u][0]=f[j][0]+1;
		else if(f[j][0]+1>f[u][1])f[u][1]=f[j][0]+1;
	}
}
void dfs2(int u,int fa){//父节点更新子节点 
	if(fa!=-1){
		int t=f[fa][0]+1;//t为父节点的最大值+1 
		//如果父节点的最大值刚好就是由u过来的,则t更新为次大值+1 
		if(f[fa][0]==f[u][0]+1)t=f[fa][1]+1;
        
        //父节点信息更新字节点信息
		if(t>=f[u][0])f[u][1]=f[u][0],f[u][0]=t;
		else if(t>f[u][1])f[u][1]=t;
	}
    //更新u的所有儿子
	for(int i=h[u];i!=-1;i=ne[i]){
		int j=e[i];
		if(j==fa)continue;
		dfs2(j,u);
	}
	ans=min(ans,f[u][0]);
}
void solve(){
	cin>>n>>k;
	idx=0,ans=INF;
	for(int i=1;i<=n;i++)
		f[i][0]=f[i][1]=-INF,h[i]=-1;
	for(int i=1;i<=k;i++){
		int x;
		cin>>x;
		f[x][0]=f[x][1]=0;
	}
	for(int i=1;i<n;i++){
		int a,b;
		cin>>a>>b;
		add(a,b),add(b,a);
	}
    //注意:dfs1和dfs2中的参数必须相同,不能上面传1下面传2,不然两次dfs的父子关系就不一样
	dfs1(1,-1);
//	for(int i=1;i<=n;i++)
//		cout<<"i="<<i<<" "<<f[i][0]<<" "<<f[i][1]<<endl;
	dfs2(1,-1);
//	for(int i=1;i<=n;i++)
//		cout<<"i="<<i<<" "<<f[i][0]<<" "<<f[i][1]<<endl;
	cout<<ans<<endl;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
}

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

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

相关文章

视频怎么加密?常见的四种视频加密方法和软件

视频加密是一种重要的技术手段&#xff0c;用于保护视频内容不被未经授权的用户获取、复制、修改或传播。在加密过程中&#xff0c;安企神软件作为一种专业的加密工具&#xff0c;可以发挥重要作用。 以下将详细介绍如何使用安企神软件对视频进行加密&#xff0c;并探讨视频加密…

VUE3学习第三篇:报错记录

1、在我整理好前端代码框架后&#xff0c;而且也启动好了对应的后台服务&#xff0c;访问页面&#xff0c;正常。 2、报错ReferenceError: defineModel is not defined 学到这里报错了 在vue网站的演练场&#xff0c;使用没问题 但是在我自己的代码里就出问题了 3、watchEffec…

等级保护测评解决方案

什么是等级保护测评&#xff1f; 网络安全等级保护是指对国家重要信息、法人和其他组织及公民的专有信息以及公开信息和存储、传输、处理这些信息的信息系统分等级实行安全保护&#xff0c;对信息系统中使用的信息安全产品实行按等级管理&#xff0c;对信息系统中发生的信息安全…

【NPU 系列专栏 3 -- NVIDIA 的 H100 和 H200 的算力介绍】

请阅读【嵌入式及芯片开发学必备专栏】 文章目录 NVIDIA H100 和 H200 的算力NVIDIA H100 芯片的算力NVIDIA H100 算力参数NVIDIA H100 举例 NVIDIA H200 芯片的算力NVIDIA H200 算力参数 H200 的内存和带宽提升H200 推理吞吐量提高H200 性能提升NVIDIA H200 举例Summary NVIDI…

DLMS/COSEM中公开密钥算法的使用_椭圆曲线加密法

1.概述 椭圆曲线密码涉及有限域上的椭圆曲线上的算术运算。椭圆曲线可以定义在任何数字域上(实数、整数、复数)&#xff0c;但在密码学中&#xff0c;椭圆曲线最常用于有限素数域。 素数域上的椭圆曲线由一组实数(x, y)组成&#xff0c;满足以下等式: 方程的所有解的集合构成…

C 语言动态链表

线性结构->顺序存储->动态链表 一、理论部分 从起源中理解事物&#xff0c;就是从本质上理解事物。 -杜勒鲁奇 动态链表是通过结点&#xff08;Node&#xff09;的集合来非连续地存储数据&#xff0c;结点之间通过指针相互连接。 动态链表本身就是一种动态分配内存的…

【C++】C++应用案例-翻转数组

翻转数组&#xff0c;就是要把数组中元素的顺序全部反过来。比如一个数组{1,2,3,4,5,6,7,8}&#xff0c;翻转之后就是{8,7,6,5,4,3,2,1}。 &#xff08;1&#xff09;另外创建数组&#xff0c;反向填入元素 数组是将元素按照顺序依次存放的&#xff0c;长度固定。所以如果想要…

全网最详细Gradio教程系列5——Gradio Client: javascript

全网最详细Gradio教程系列5——Gradio Client: javascript 前言本篇摘要5. Gradio Client的三种使用方式5.2 使用Gradio JavaScript Client5.2.1 安装1. npm方式2. CDN方式3. 在线运行环境&#xff1a;PLAYCODE 5.2.2 连接到Gradio程序1. 通过URL或SpaceID连接2. 辅助&#xff…

RuoYi-Vue-Plus (多数据源注解使用、【手动、拦截器】切换数据源)

接上文多数据源配置&#xff1a; RuoYi-Vue-Plus (多数据源配置)-CSDN博客 一、功能演示 代码生成菜单页面&#xff0c; 展示数据源切换 查询主库 查询从库 二、前端传参切换数据源 页面路径&#xff1a; src/views/tool/gen/index.vue 搜索框如下&#xff1a;下面4发送请求时…

SPICE | 常见电路SPICE模型总结

Ref. 1. CMOS VLSI Design: A Circuits and Systems Perspective 目录 0 基础 1 反相器 inverter 2 缓存器 buffer 3 NAND 4 NOR 5 传输门 Transmission gate 6 三态反相器 Tristate Inverter 7 选择器 Multiplexers 8 D锁存器 D Latch 9 D触发器 D Flip-Flop 0 基础…

Linux文件描述符

前言 我们以前就听过"Linux下一切皆文件"&#xff0c;但是说实话我们只是记住了这句话&#xff0c;实质是不理解的&#xff01;本期我们就会解释&#xff01; 本期内容介绍 • 回顾C语言文件操作 • 系统I/O操作接口 • 文件描述符fd • 理解Linux下一切皆文件 • …

如何设置postgresql数据库的账户密码

说明&#xff1a;在我的云服务器上&#xff0c;postgres是使用yum的方式安装的&#xff0c;不需要设置postgres账户的密码&#xff0c;本文介绍安装后如何手动设置postgres账户的密码&#xff1b; postgres数据库安装&#xff0c;参考下面这篇文章&#xff1a; PostgreSQL安装…

构建基于Spring Boot的SaaS应用

引言 在设计和实现SaaS系统时&#xff0c;安全性是至关重要的考虑因素。一个全面的安全策略不仅能保护系统免受恶意攻击&#xff0c;还能确保用户数据的机密性、完整性和可用性。本文将探讨在SaaS架构中实现数据加密、敏感信息保护以及应用安全的最佳实践和技术方案&#xff0…

【大模型】基于LoRA微调Gemma大模型(1)

文章目录 一、LoRA工作原理1.1 基本原理1.2 实现步骤 二、LoRA 实现2.1 PEFT库&#xff1a;高效参数微调LoraConfig类&#xff1a;配置参数 2.2 TRL库SFTTrainer 类 三、代码实现3.1 核心代码3.2 完整代码 参考资料 大模型微调技术有很多&#xff0c;如P-Tuning、LoRA 等&#…

Vue3计算属性终极实战:可媲美Element Plus Tree组件研发之节点勾选

前面完成了JuanTree组件的节点编辑和保存功能后&#xff0c;我们把精力放到节点勾选功能实现上来。**注意&#xff0c;对于组件的开发者来说&#xff0c;要充分考虑用户的使用场景&#xff0c;组件提供的多个特性同时启用时必须要工作良好。**就拿Tree组件来说&#xff0c;用户…

数据库(MySQL)-视图、存储过程、触发器

一、视图 视图的定义、作用 视图是从一个或者几个基本表&#xff08;或视图&#xff09;导出的表。它与基本表不同&#xff0c;是一个虚表。但是视图只能用来查看表&#xff0c;不能做增删改查。 视图的作用&#xff1a;①简化查询 ②重写格式化数据 ③频繁访问数据库 ④过…

如何学习Doris:糙快猛的大数据之路(从入门到专家)

引言:大数据世界的新玩家 还记得我第一次听说"Doris"这个名字时的情景吗?那是在一个炎热的夏日午后,我正在办公室里为接下来的大数据项目发愁。作为一个刚刚跨行到大数据领域的新手,我感觉自己就像是被丢进了深海的小鱼—周围全是陌生的概念和技术。 就在这时,我的…

江苏科技大学24计算机考研数据速览,有专硕复试线大幅下降67分!

江苏科技大学&#xff08;Jiangsu University of Science and Technology&#xff09;&#xff0c;坐落在江苏省镇江市&#xff0c;是江苏省重点建设高校&#xff0c;江苏省人民政府与中国船舶集团有限公司共建高校&#xff0c;国家国防科技工业局与江苏省人民政府共建高校 &am…

pyqt designer使用spliter

1、在designer界面需要使用spliter需要父界面不使用布局&#xff0c;减需要分割两个模块选中&#xff0c;再点击spliter分割 2、在分割后&#xff0c;再对父界面进行布局设置 3、对于两边需要不等比列放置的&#xff0c;需要套一层 group box在最外层进行分割