Codeforces Round 929 (Div. 3)题解

news2025/2/25 0:28:52

A. Turtle Puzzle: Rearrange and Negate(Problem - A - Codeforces)

题目大意:现有一个数组a[],我们需要执行两个操作,首先将原数组按照任意顺序排序(当然也可以不排序),然后选择一段区间,将这段区间中的数全部变成它们的相反数(当然也可以选择长度是0的区间),问最后数组和的最大值是多少。

思路:很显然就是通过第一个操作将所有的负数放在一块儿,然后通过第二个操作将所有的负数变成它们的相反数,然后再相加。所以直接将所有数的绝对值加起来即可。

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
	int t;
	scanf("%lld",&t);
	while(t--)
	{
		int n;
		scanf("%lld",&n);
		int res=0;
		while(n--)
		{
			int x;
			scanf("%lld",&x);
			res += abs(x);
		}
		printf("%lld\n",res);
	}
}

B. Turtle Math: Fast Three Task(Problem - B - Codeforces)

题目大意:有一个数组a[],我们可以执行若干次操作,每次操作可以选择一下两种之一:
1.删掉其中一个数
2.将其中一个数加1
问至少通过多少次操作可以使数组和可以整除3.

思路:这题有个很巧妙的地方,最多操作两次,因为原数组的和mod 3只有三种情况,0,1,2,如果是0,那么就不用操作;如果是1或者2,那么加上1或2就可以满足要求,加上1只需要操作一次,哪怕只用删除一个数也是一次,直接输出就可;加上2需要操作两次,那么就要看看能否通过删除某个数代替,遍历一遍即可。

#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n;
		scanf("%d",&n);
		int sum=0;
		for(int i=1;i<=n;i++) scanf("%d",&a[i]),sum += a[i];
		if(sum%3==0) printf("0\n");
		else if((sum+1)%3==0) printf("1\n");
		else
		{
			int flag=0;
			for(int i=1;i<=n;i++)
			{
				if((sum-a[i])%3==0) 
				{
					flag=1;
					break;
				}
			}
			if(flag) printf("1\n");
			else printf("2\n");
			
		}
	}
}

C. Turtle Fingers: Count the Values of k(Problem - C - Codeforces)

题目大意:给定正整数a,b,l,要求找出三个非负数k,x,y满足l=k*(a^x)*(b^y),问不同的k有多少个。

思路:这里x和y都可以是0,那么k=l,所以k的上限是l,但是本题没有单调性,不能用二分,如果直接枚举的话时间复杂还是有点高,那么我们既然不能枚举k,可以用x和y入手,我们可以找出x和y的最大值,这个很好找,就看最多多少个a相乘不超过l,最多多少个b相乘不超过l即可。最后我们循环枚举x和y的值,然后判断是否有k即可,另外为了保证k不重复,我们可以用一个集合装数,然后输出集合大小。

#include<bits/stdc++.h>
using namespace std;
#define int long long
int qm(int a,int m)
{
	int res=1;
	for(int i=1;i<=m;i++) res *= a;
	return res;
}
signed main()
{
	int t;
	scanf("%lld",&t);
	while(t--)
	{
		int l,a,b;
		scanf("%lld%lld%lld",&a,&b,&l);
		int na=0,nb=0;
		int tmp=l;
		while(tmp/a)
		{
			na++;
			tmp /= a;
		}
		tmp=l;
		while(tmp/b)
		{
			nb++;
			tmp /= b;
		}
		set<int>q;
		for(int i=0;i<=na;i++)
		{
			for(int j=0;j<=nb;j++)
			{
				int d=qm(a,i)*qm(b,j);
				if(l%d==0) 
				{
					q.insert(l/d);
				}
			}
		}
		cout<<q.size()<<endl;
		
	}
}

D. Turtle Tenacity: Continual Mods(Problem - D - Codeforces)

题目大意:现有一个数组a[],问能否找到一个排序使得a1%a2%a3%...%an!=0,如果可以就输出"YES",否则就输出"NO".

思路:比赛的时候猜了一个结论,找出所有数的最大公因数,如果这个最大公因数在数组中出现次数超过一次,那么就不可以,否则就是可以的。当时没仔细证明,直接交了然后就ac了,现在稍微证明一下。根据欧几里得算法(求gcd算法的原理),我们可以知道a%b一定是a,b最大公因数的的倍数,那么如果最大公因数在数组中只出现一次,很显然,我们把它放开头就可以避免出现余数为0的情况,但是如果出现两次及以上就避无可避的会出现g%g=0的情况。如果不出现,那么最后一定可以通过某种顺序得到这个最大公因数。至于这个结论是怎么猜出来的呢,其实也比较巧,首先很显然小的数mod大的数结果是不变的,而小的数有两种来源,一种是原数组中的数,另一种则是原数组中的数取模得到更小的数,所以我们如果尽早得到最小的那个数,然后从这个数开始取模的话,后面的除非遇到等于它的数,否则就不会出现0。原数组中最小的数很好找,问题在于通过取模得到的最小的数是多少呢,这里就想到最大公因数,数组中通过取模可以得到的最小的数就是整个数组的最大公因数,然后再统计一下最大公因数的出现次数。

#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n;
		scanf("%d",&n);
		int g=0;
		for(int i=1;i<=n;i++) scanf("%d",&a[i]),g=__gcd(g,a[i]);
		int c=0;
		for(int i=1;i<=n;i++)
		{
			if(a[i]==g) c++;
		}
		if(c<=1) printf("YES\n");
		else printf("NO\n");
	}
}

E. Turtle vs. Rabbit Race: Optimal Trainings(Problem - E - Codeforces)

题目大意:现在有若干段路,我们需要计算跑完其中一部分连续的路后得到的收益,收益的计算如下:
定义一个整数u,然后跑过的第一个单位长度收益是u,跑过第二个单位长度的收益是u-1,以此类推,可以出现负数。
现在给定连续区间的左端点和初始值u,要求找出收益最大的情况下右端点的最小值。

思路:这题先用暴力的做法实现,很明显枚举计算最大值即可,一旦某个位置的值开始变小,那么就说明开始出现负数了,就没有再往后枚举的必要,这里直接暴力的时间复杂度较高,只能过5个数据,然后因为要快速算一段区间的和,所以想到用前缀和来优化,然后能过7个数据,时间复杂度还是高了。然后就想到用二分来找,但是当时可能比较着急,没有仔细分析性质,所以二分找出来的值并不合适。我们定义选定的区间的总长度为res,那么收益就是(2u+1-res)*res/2,起初我虽然二分的是r的值,但是判断条件选的却是收益,显然收益是一个二次函数,图像是抛物线,并非单调的。但是可能因为太着急了,并没有仔细分析性质,一直改一直交一直wa,最后终于想着分析一下,这一分析就找到问题的关键了,对于这个二次函数,很显然最大值应该在u+1/2的时候取到,但是因为值都是整数,所以要么在u处取到最大值,要么在u+1处取到最大值,所以我们可以找最接近u的数,那么我们可以通过找到第一个大于u的值来实现,因为跑道长度都是正的,所以一定是单增的,可以用二分来查找。那么最大值只有可能在找到的位置或者前一个位置出现,对于这两个值计算判断一下就可以实现。

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,u,le;
int a[100010],s[100010];
int check(int mid)
{
	int res=s[mid]-s[le-1];
	return (u+u-res+1)*res/2;
}
 
signed main()
{
	int t;
	scanf("%lld",&t);
	while(t--)
	{
		scanf("%lld",&n);
		for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
		for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
		int q;
		scanf("%lld",&q);
		while(q--)
		{
			scanf("%lld%lld",&le,&u);
			int l=le,r=n;
			while(l<r)//找到第一个大于u的位置
			{
				int mid=(l+r)/2;
				if(s[mid]-s[le-1]>=u) r=mid;
				else l=mid+1;
			}
			if(s[r]-s[le-1]==u||r==le) printf("%lld ",r);
			else 
			{
				int a=s[r]-s[le-1],b=s[r-1]-s[le-1];
				if((2*u+1-a)*a<=(2*u+1-b)*b) printf("%lld ",r-1);
				else printf("%lld ",r);
			}
		}
		printf("\n");
	}
}

F. Turtle Mission: Robot and the Earthquake(Problem - F - Codeforces)

题目大意:在一张n*m的方格地图中,有一些位置有石头,所有石头每秒向上移动一个单位,每一列都是循环的,及开头结尾可以视为连在一起,机器人从(0,0)出发,要达到(n-1,m-1),机器人每秒必须移动,而且移动方向只有三种选择:1.向右移动一个单位长度;2.向上移动一个单位长度;3向下移动一个单位长度。问最少需要多少秒可以到达,如果不能到达的话输出-1.

思路:这里本来想打表处理每个位置在某一时刻是否有石头,然后然后直接暴力搜索开始移动的。但是很显然空间和时间都会超,所以这个方法显然不可行。那么该如何做呢,有两种思路,一种思路是我们可以在移动的过程中记录时间,然后对于每一个将要移动到的位置,将它映射到最开始的图中进而判断此处是否能够移动。另一种思路很巧妙,假设石头是固定的,机器人和终点每秒向下移动,由于移动是相对的,所以这个可以等效替代前面一种方法的记录。在第二种方法中,机器人就只有三种操作了,静止不动(对应原来的上移,一上一下就相当于没动),向下移动两格(对应原来的向下移动),向右下移动(对应原来的向右移动)。然后我们可以通过宽搜得到机器人到最后一列的时间,然后对于每个位置,计算终点移动到此处需要花费多少时间,因为在我们的等效中,机器人是有静止不动这种操作的,而且石头我们也认为是静止不动的,所以此时移动的只有终点,那么就计算终点移动到此处花费的时间即可,然后在所有时间中找最小值,如果最小值不存在,那么就输出-1.

然后还有一个细节就是这个花费时间如何计算。这里用到的思路特别妙,我们在对最后一列进行讨论的时候是知道横坐标的,也就是说我们知道机器人在最后一列的什么位置,那么计算的思路就是考虑终点从最底层到机器人的位置需要移动多少,显然这个是很容易得到的,然后问题就转化成终点是往下移动到底端然后再到机器人位置,还是不用移动到底端,直接往下移动就可以到机器人的位置。因为我们计算实际上是用移动整趟的时间加上到机器人位置的时间。上面两种情况对应的移动整趟的时间是不一样的。先移动到底端的话,考虑整趟时间就是当前位置的时间还要加上一点;直接移动到目标位置的话就是当前时间减去一点,也即考虑它上一次到达底端的时间。我们可以用(t-h)/n上取整得到我们总共移动了多少个整趟,这么讲可能还是有点抽象,结合以下几种情况来讨论一下:

对于第一种情况,显然x-h的结果是负数,这种情况我们就单独考虑,直接返回h即可

对于第二种情况,x-h是一个大于0小于n的数,考虑实际的移动,显然是先移动到底端然后再加一个h,(x-h)/n上取整刚好是1,再加上h就是实际的移动。

第三种情况,x-h是一个大于0,小于n的数,考虑实际的移动,也是先退回到上一次移动到底端的时间再加上一个h得到的。而(x-h)/n上取整得到的刚好是1,符合我们的讨论。

第四种情况,考虑的时候应该是先移动到底端,然后再加上一个h,也就是完整的移动两趟,然后再加一个h得到,而x-h是一个大于n小于2n的数,上取整后刚好是2,也是符合实际情况的。

由于c++除法的性质,为了实现上取整,有两种思路,一种是调用ceil()函数,一种是加上n-1之后再进行整除,这样刚好实现上取整。

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
const int N=1010;
int g[N][N],d[N][N];
typedef pair<int,int> pii;
int n,m;
void bfs()
{
	queue<pii>q;
	d[0][0]=0;
	q.push({0,0});
	while(q.size())
	{
		auto t=q.front();
		q.pop();
		if(!g[(t.x+1)%n][t.y]&&!g[(t.x+2)%n][t.y]&&!d[(t.x+2)%n][t.y]) 
		{
			d[(t.x+2)%n][t.y]=d[t.x][t.y]+1;
			q.push({(t.x+2)%n,t.y});
		}
		if(!g[(t.x+1)%n][(t.y+1)%m] && !d[(t.x+1)%n][(t.y+1)%m]) 
		{
			d[(t.x+1)%n][(t.y+1)%m]=d[t.x][t.y]+1;
			q.push({(t.x+1)%n,(t.y+1)%m});
		}
	}
}

int cal(int x, int h) 
{
    if (x < h) return h;
    return ((x - h + n - 1) / n * n) + h;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++) 
				scanf("%d",&g[i][j]),d[i][j]=0;
		bfs();	
		int ans = -1, tmp;
    	if(d[n-1][m-1]) 
		{
        	tmp = cal(d[n-1][m-1], 0);
        	ans = (ans == -1 || ans > tmp) ? tmp : ans;
    	}
    	for(int i = 0; i < n - 1; ++i) 
		{
        	if (!d[i][m-1]) continue;
        	tmp = cal(d[i][m-1], i + 1);
        	ans = (ans == -1 || ans > tmp) ? tmp : ans;
    	}
    	printf("%d\n", ans);	
	}
}

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

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

相关文章

Selenium操作360浏览器

Selenium操作360浏览器 1. 查看当前使用的360浏览器内核chrome是哪个版本&#xff1a; 2. 下载对应的chromedriver https://chromedriver.chromium.org/downloads 3. demo # 打开360浏栏器 from selenium import webdriver import contextlib options webdriver.ChromeOpt…

单词规律00

题目链接 单词规律 题目描述 注意点 pattern只包含小写英文字母s只包含小写英文字母和 ’ ’s不包含任何前导或尾随对空格s中每个单词都被 单个空格 分隔 解答思路 本题与上一次同构字符串类似&#xff0c;思路可以参照同构字符串 代码 class Solution {public boolean …

华为云项目部署

前端部署 将dist文件夹下的内容拷贝到/usr/local/nginx/html下 #启动脚本是在 # /usr/local/nginx/sbin/nginx #启动 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf #停止 /usr/local/nginx/sbin/nginx -s stop #重载 /usr/local/nginx/sbin/nginx -s rel…

对猫毛过敏还能养猫吗?宠物空气净化器帮你缓解猫毛过敏

很多人都知道&#xff0c;猫咪会掉毛。然而&#xff0c;像猫狗这样的宠物可能会成为一些病毒的传播源&#xff0c;对于对空气质量要求很高的朋友来说&#xff0c;这可能会导致过敏。此外&#xff0c;如果猫咪的排泄物等不及时清理&#xff0c;也可能会导致环境质量下降&#xf…

如何在Linux系统Docker部署Wiki.js容器并结合内网穿透实现远程访问本地知识库

文章目录 1. 安装Docker2. 获取Wiki.js镜像3. 本地服务器打开Wiki.js并添加知识库内容4. 实现公网访问Wiki.js5. 固定Wiki.js公网地址 不管是在企业中还是在自己的个人知识整理上&#xff0c;我们都需要通过某种方式来有条理的组织相应的知识架构&#xff0c;那么一个好的知识整…

Django官网项目

项目准备 使用VSCODE做IDE。 检查Python版本。 sudo apt install sudo apt update python3 --version创建项目路径&#xff0c;创建虚拟环境&#xff0c;创建项目 路径 \mysite 进入路径&#xff0c;运行VSCODE 运行 "code ." 创建虚拟环境。 选择 >python: c…

【力扣hot100】刷题笔记Day15

前言 今天要刷的是图论&#xff0c;还没学过&#xff0c;先看看《代码随想录》这部分的基础 深搜DFS理论基础 深搜三部曲 确认递归函数、参数确认终止条件处理目前搜索节点出发的路径 代码框架 void dfs(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本节点…

11.以太网交换机工作原理

目录 一、以太网协议二、以太网交换机原理三、交换机常见问题思考四、同网段数据通信全过程五、跨网段数据通信全过程六、关键知识七、调试命令 前言&#xff1a;在网络中传输数据时需要遵循一些标准&#xff0c;以太网协议定义了数据帧在以太网上的传输标准&#xff0c;了解以…

详细讲解:文物预防性保护解决方案的目标

一、文物预防性保护方案的系统目标 可移动文物预防性保护监测与调控系统,是博物馆开展科学、有效的预防性保护策略的关键工程&#xff0c;整套系统包括监测系统平台建设、调控设备部署、数据传输设备部署和环境数据监测设备安装工程。项目完成时将达到以下目标: 1)构建覆盖全…

如何在群晖NAS中开启FTP服务并实现公网环境访问内网服务

文章目录 1. 群晖安装Cpolar2. 创建FTP公网地址3. 开启群晖FTP服务4. 群晖FTP远程连接5. 固定FTP公网地址6. 固定FTP地址连接 本文主要介绍如何在群晖NAS中开启FTP服务并结合cpolar内网穿透工具&#xff0c;实现使用固定公网地址远程访问群晖FTP服务实现文件上传下载。 Cpolar内…

Flutter 数据持久化存储之Hive库

Flutter 数据持久化存储之Hive库 前言正文一、配置项目二、UI① 增加UI② 显示和删除UI 三、使用Hive① 初始化Hive② TypeAdapter自定义对象③ 注册TypeAdapter③ CURD 四、源码 前言 在Flutter中&#xff0c;有多种方式可以进行数据持久化存储。以下是一些常见的方式&#xf…

linux下查看某个命令在哪里个安装包程序下,以ifconfig命令举例子

yum list | grep net-tools &#xff08;查看yum安装列表中有没有安装指定的软件工具&#xff09;

Leetcoder Day29| 贪心算法part03

1005.K次取反后最大化的数组和 给定一个整数数组 A&#xff0c;我们只能用以下方法修改该数组&#xff1a;我们选择某个索引 i 并将 A[i] 替换为 -A[i]&#xff0c;然后总共重复这个过程 K 次。&#xff08;我们可以多次选择同一个索引 i。&#xff09; 以这种方式修改数组后&a…

Fast admin改变对话框的文字,并且绑定参数,确认和取消都可以做修改

需求&#xff1a;点击确认和拒绝都要做出对应的操作 列表添加一个buttos按钮用来单击触发对话框 {field: operate, title: __(Operate), table: table, events: Table.api.events.operate, buttons: [{name: click,title: __(点击执行事件),classname: btn btn-xs btn-info bt…

逆变器专题(6)-正负序分离(二阶广义积分器DSOGI)

相应仿真原件请移步资源下载 DSOGI作为一种常用的正负序分离方法&#xff0c;其可以在电压三相不平衡的状态下实现较为精准的锁相环。 原理 构建基于二阶广义积分器的自适应滤波器来实现90相角偏移和谐波的滤除。 其中&#xff0c;&#xff0c;表示原信号进行滞后90&#xff…

成功解决IndexError: Target 20 is out of bounds.

【PyTorch】成功解决IndexError: Target 20 is out of bounds. &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您…

Redisson限流算法

引入依赖 <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.12.3</version> </dependency>建议版本使用3.15.5以上 使用 这边写了一个demo示例&#xff0c;定…

kswapd0挖矿病毒攻击记录

文章目录 一、起因与病毒分析1、起因2、阿里云告警2.1 恶意脚本代码执行12.2 恶意脚本代码执行22.3恶意脚本代码执行32.4 恶意脚本代码执行4 3、病毒简单分析3.1 病毒的初始化3.2 病毒本体执行 4、总结 二、ubuntu自救指南1、病毒清理2、如何防御 一、起因与病毒分析 1、起因 …

跳跃游戏Ⅱ

问题 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - …

【深蓝学院】移动机器人运动规划--第7章 集群机器人运动规划--笔记

文章目录 0. Contents1. Multi-Agent Path Finding (MAPF)1.1 HCA*1.2 Single-Agent A*1.3 ID1.4 M*1.5 Conflict-Based Search(CBS)1.6 ECBS1.6.1 heuristics1.6.2 Focal Search 2. Velocity Obstacle (VO&#xff0c;速度障碍物)2.1 VO2.2. RVO2.3 ORCA 3. Flocking model&am…