Codeforces Round #831 (Div. 1 + Div. 2)

news2024/11/26 8:36:40

A. Factorise N+M

题目链接:Dashboard - Codeforces Round #831 (Div. 1 + Div. 2) - Codeforces

样例输入: 

3
7
2
75619

样例输出:

2
7
47837

题意:给定一个质数,让我们输出一个质数使得这两个数相加为一个合数。

分析:很显然直接输出给定的质数即可,这样两个质数相加一定是一个偶数,而且不是2,所以肯定是一个合数。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
const int N=2e5+10;
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		scanf("%d",&n);
		printf("%d\n",n);
	}
	return 0;
} 

B. Jumbo Extra Cheese 2

题目链接:Problem - B - Codeforces

样例输入: 

3
4
4 1
4 5
1 1
2 3
3
2 4
2 6
2 3
1
2 65

样例输出:

26
24
134

题意:给定一个n代表矩形数目,每个矩形给定一个长和高,我们可以对这个矩形进行旋转,然后让一边贴至数轴上,另一边与一个矩形的一条边重合,问这样最后拼成的多边形的周长最少是多少

分析:我们的目的就是尽可能地让两个矩形重合的边的长度最大,这样可以使得不被计算的长度最大,那么我们可以让每个矩形中长和高中的较大值作为高,然后把所有的矩形按照高度进行排序,然后依次拼接即可,最后发现周长就是所有矩形的长的和*2+矩形中的最大高*2.

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
const int N=2e5+10;
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		scanf("%d",&n);
		int a,b;
		int mxh=0;
		long long ans=0;
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d",&a,&b);
			if(a>b) swap(a,b);
			mxh=max(mxh,b);
			ans+=a*2;
		}
		printf("%lld\n",ans+mxh*2);
	}
	return 0;
}

C. Bricks and Bags

题目链接:Problem - C - Codeforces

样例输入: 

3
5
3 1 5 2 3
4
17 8 19 45
8
265 265 265 265 265 265 265 265

样例输出:

6
63
0

题意:给定一个n代表砖块数量,每个砖块有一个重量,现在有3个包,我们可以把每块砖块放至在3个包中的任何一个,但要保证每个包中最后至少要有一块砖块,一个人负责把砖块分配到每个包中,另一个人负责从每个包中分别取出一块砖块,不妨设取出的三块转的重量分别是wi,wj,wk,那么最后的结果就是|wi-wj|+|wj-wk|,现在分配砖块的人想要使得这个结果最小,而取砖块的人想要使得这个值最大,问这个值最少是多少。

分析:我们先对砖块进行排序,不难想到对于一个包中的砖块应该是重量最接近的一些砖块,只有这样才能使得后手操作后值的变化尽可能地小,因为这样无论取出哪一块砖的影响都不是特别大。比如我们按照重量拍排完序后的结果是w1,w2,……,wn,我们选择前i个放入第二个背包,然后将第i+1~n-1个砖块放入第一个背包,最后将第n个砖块单独放入第三个背包,这样显然结果等于|wi-wi+1|+|wi-wn|,我们只要遍历一遍取一次最大值即可。需要注意的一点是我们还应该倒序来一遍,因为有可能是重量最小的砖块单独放在三号包中。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
const int N=2e5+10;
int a[N];
bool cmp(int a,int b)
{
	return a>b;
}
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
			scanf("%d",&a[i]);
		sort(a+1,a+n+1);
		int ans=0;
		for(int i=1;i<n-1;i++)
			ans=max(ans,abs(a[i]-a[i+1])+abs(a[i]-a[n]));
		sort(a+1,a+n+1,cmp);
		for(int i=1;i<n-1;i++)
			ans=max(ans,abs(a[i]-a[i+1])+abs(a[i]-a[n]));
		printf("%d\n",ans);
	}
	return 0;
}

D. Knowledge Cards

题目链接:Problem - D - Codeforces

样例输入:

4
3 3 6
3 6 4 1 2 5
3 3 10
1 2 3 4 5 6 7 8 9 10
5 4 4
2 1 3 4
3 4 10
10 4 9 3 5 6 8 2 7 1

样例输出:

YA
TIDAK
YA
YA

题意:给定一个n*m的方格网,一开始在(1,1)有k张卡片,每一张卡片有一个编号,是一个1~k的排列,我们要将这k张卡片全部移至(n,m),而且要保证(n,m)处的卡片按照从下往上逐渐减小的顺序进行摆放,保证除了(1,1)和(n,m)之外的每个位置不能同时摆放两张卡片,而且我们只能从(1,1)进行取卡片,不能存卡片,只能向(n,m)进行存卡片,而不能取卡片。

分析:通过华容道游戏我们可以知道,整个方格网中只要有1个空余的格子,我们就可以将任何一个格子移动到任何一个我们想要移动的位置,所以问题就转化为我们取到当前想要移动到(n,m)的卡片时整个方格网中的空余方格数是多少,如果大于2就可以,否则不行,大于2是因为我们将我们当前要取的数移动至一个空格子后空格子的数目会少1,而我们要保证移动过程中始终有一个空格子,这个很好求,直接用set记录一下当前占用空余方格的数即可,因为在i放入(n,m)之前,原来在i上面的而且值小于i的卡片全部都在空余方格中,所以我们只要统计一下这些数的数目即可。

细节见代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
#include<set>
using namespace std;
const int N=2e5+10;
int a[N];
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int n,m,k;
		scanf("%d%d%d",&n,&m,&k);
		for(int i=1;i<=k;i++)
			scanf("%d",&a[i]);
		set<int>s;
		bool flag=true;
		int l=1;
		for(int i=k;i>=1;i--)
		{
			if(s.find(i)==s.end())
			{
				while(a[l]!=i) s.insert(a[l++]);
				l++;
				if(s.size()>(n*m-4))
				{
					flag=false;
					break;
				}
			}
			else
				s.erase(i);
		}
		if(flag) puts("YA");
		else puts("TIDAK");
	}
	return 0;
}

E. Hanging Hearts

题目链接:Problem - E - Codeforces

样例输入: 

6
1 2 1 4 2

样例输出:

4

题意:有一棵有n个节点的树,我们需要给这n个节点一个点权,这n个点的点权是位于1~n的,而且两两不同。我们现在有一个空的数组s,每次我们选择一个叶子节点x进行以下操作:

把这个节点的权值加入到s数组的末尾

如果这个节点的点权小于父亲节点的点权那么就将父亲节点的点权改为这个节点的点权

删除节点x

求最后操作完所有的节点后的s数组中的最长非递减子序列的最大长度。

分析:我们通过分析简单的一些例子可以发现,如果操作完这个子树中的所有非根节点,那么这棵树的根节点的权值就是该树中所有子节点的权值的最小值

那么有了这个性质我们就不难得到一些其他的结论:

(1)最长非递降序列中不可能同时取当前结点以及当前结点的两个及以上的子节点

(2)如果不取当前节点则可以取当前节点的所有子节点

为什么会有这样的结论呢?

比如说1号节点有两个子节点2和3,那么我们假如先操作完以2为根的子树中的全部节点,那么1的节点的点权就变为1号节点和以2为根的子树中所有节点的点权的最小值,这个时候我们需要讨论以2号节点为根的子树中的全部节点的点权最小值与1号节点的点权和以3号节点为根的子树中的全部节点的点权最小值的关系,三者是两两不同的,不妨假设三者的权值分别为w1,w2,w3,假设w2<w1<w3,那么我们操作完2号节点后那么3号节点是不可能作为有效序列了,因为w3>w2,

但是我们可以先取w2,再取w3,这个时候就去掉了1号节点的所有子节点,但是1号节点就没办法再作为有效长度了,因为每棵子树所能形成的序列是独立的,所以我们每次使得一棵子树中的所有节点的初始权值连续即可,同理可以分析其他情况,由于分析方法类似,这里就不一一证明了。

知道了这些性质,我们直接进行树形DP即可:

f[i][0]表示不选当前子节点所能得到的最长长度

f[i][1]表示选当前子节点所能得到的最长长度

更新节点i的所有子节点j,有:

f[i][0]+=max(f[j][0],f[j][1])

f[i][1]=max(f[i][1],f[j][1]+1)

细节见代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
const int N=2e5+10;
int h[N],e[N],ne[N],idx;
int f[N][2];
/*
f[i][0]表示不选当前子节点所能得到的最长长度
f[i][1]表示选当前子节点所能得到的最长长度 

最长非递降序列中不可能同时取当前结点以及当前结点的两个及以上的子节点 
如果不取当前节点则可以取当前节点的所有子节点 
*/
void add(int x,int y)
{
	e[idx]=y;
	ne[idx]=h[x];
	h[x]=idx++;
}
void dfs(int x)
{
	f[x][0]=0;f[x][1]=1;
	for(int i=h[x];i!=-1;i=ne[i])
	{
		int j=e[i];
		dfs(j);
		f[x][0]+=max(f[j][0],f[j][1]);
		f[x][1]=max(f[x][1],f[j][1]+1);
	}
	return ;
} 
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) h[i]=-1;
	for(int i=2;i<=n;i++)
	{
		int t;
		scanf("%d",&t);
		add(t,i);
	}
	dfs(1);
	printf("%d",max(f[1][0],f[1][1]));
	return 0;
}

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

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

相关文章

基于Java的飞机雷电射击游戏的设计实现(Eclipse开发)

目 录 摘 要 I Abstract II 1 引言 3 1.1 项目背景 3 1.2 电脑游戏的发展历史 3 1.3国内游戏项目研究现状 5 1.4项目主要工作 6 1.5本文组织结构 7 1.6 电脑游戏的策划 7 2 开发平台与开发技术 8 2.1 Eclipse 8 2.2 Eclipse平台 8 2.3 Java 9 2.4游戏图形界面的开发基础 11 2.5…

redis启动和简单使用

redis启动和简单使用 1.redis启动 1.1 找到redis解压的位置,在里面输入cmd回车 1.2 输入redis-server redis.conf指令,然后回车,出现如下界面 注意&#xff1a;该界面不能关闭了 1.3 再进入一次redis解压的位置 输入cmd回车 1.4 输入redis-cli指令后的结果 1.5 补充 当出现…

Flink系列文档-(YY05)-Flink编程API-多流算子

1 多流连接 connect connect连接&#xff08;DataStream,DataStream→ConnectedStreams) connect翻译成中文意为连接&#xff0c;可以将两个数据类型一样也可以类型不一样DataStream连接成一个新的ConnectedStreams。需要注意的是&#xff0c;connect方法与union方法不同&…

Hadoop高手之路3-Hadoop集群搭建

文章目录Hadoop高手之路3-Hadoop集群搭建一、集群的规划二、再准备两台虚拟机作为服务器1. 根据hadoop001克隆出hadoop002和hadoop0032. 配置hadoop002和hadoop0031) 启动hadoop002虚拟机并登录2) 配置ip地址3) 重启网络服务器&#xff0c;查看ip4) 远程连接hadoop0025) 修改主…

数据库自增ID用完了会怎么样?

有主键 如果设置了主键&#xff0c;并且一般会把主键设置成自增。 Mysql里int类型是4个字节&#xff0c;如果有符号位的话就是[-231,231-1]&#xff0c;无符号位的话最大值就是2^32-1&#xff0c;也就是4294967295。 创建一张表&#xff1a; CREATE TABLE test1 (id int(11…

人脸识别技术趋势与发展

人脸辨识 —— 引人入胜 很少有生物辨识技术能像脸部辨识那样激发我们的想象力。 同样&#xff0c;它的到来在 2020 年引发了深刻的担忧和令人惊讶的反应。 脸部辨识的工作原理 脸部辨识是使用脸部辨识或验证人的身份的过程。它根据人的脸部细节捕获、分析和比较模式。 人…

Restful风格的编程

Restful风格的编程1、 Restful简介2、查询用户以及用户详情2.1常用注解2.2查询用户详情3、处理创建请求3.1RequestBody注解3.1.1用途3.1.2语法规范3.2日期类型的处理3.3BindingResult4、用户信息修改与删除4.1用户信息修改4.2案例前端界面后端控制器1、 Restful简介 Restful比…

剑指offer(C++)-JZ69:跳台阶(算法-动态规划)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 题目描述&#xff1a; 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法&…

【JavaSE】类与对象(上)类是什么?对象是什么?

文章目录面向过程与面向对象认识类和对象创建类类的实例化内存分布注意事项总结面向过程与面向对象 我们说C语言是面向过程的编程语言&#xff0c;而Java是面向对象的编程语言&#xff0c;那究竟什么才是面向过程与面向对象呢&#xff1f;我们举一个例子来帮助大家理解&#x…

PX4飞行测试

文章目录前言一、首次飞行指南飞行入门解锁飞机起飞降落飞行控制/命令辅助飞行任务飞行规划任务设置机体航向设置航点/转弯半径地理围栏故障保护地理围栏地理围栏规划安全点(集结点)创建/定义安全点地形跟随/保持地形跟随地形保持前言 本节包含有关飞行&#xff08;完全配置过…

虚拟主播也带货?直播电商的变与不变

5月6日晚&#xff0c;海外虚拟主播vox在B站开启了中国直播首秀。从最终数据来看&#xff0c;直播1.7小时&#xff0c;营收111万人民币&#xff0c;当晚还登上平台热门首位&#xff0c;这样的直播吸金能力&#xff0c;让不少明星都望尘莫及。 更值得关注的是&#xff0c;直播间…

Matlab:表达式

Matlab&#xff1a;表达式变量数字矩阵运算符数组运算符函数表达式示例变量 与大多数其他编程语言一样&#xff0c;MATLAB 语言提供数学表达式&#xff0c;但与大多数编程语言不同的是&#xff0c;这些表达式涉及整个矩阵。 MATLAB 不需要任何类型声明或维度说明。当 MATLAB …

PyCharm 这40个使用技巧真棒

大家好&#xff0c;今天分享 PyCharm 40个使用技巧&#xff0c;内容有点长&#xff0c;喜欢欢迎收藏、分享、点赞。 废话不多说。我们开始吧&#xff01; 文章目录技术提升第一章&#xff1a;运行调试篇1\. 通过指定参数&#xff0c;执行程序2\. 程序结束了&#xff0c;照样可…

Vue 3 属性绑定细节

在ButtonDemo中默认会把传给这个组件上的所有事件,都传递给Button中的最外层的元素 不管这个最外层的元素是什么!比如下图:在button外面还有一个div,那么传递给最外层的就应该是div,而不是button 最外层为div 想让组件的某一个部分,点击时被触发click事件 现在传递给最…

LeetCode-764. 最大加号标志【动态规划,二维数组】

LeetCode-764. 最大加号标志【动态规划&#xff0c;二维数组】题目描述&#xff1a;解题思路一&#xff1a;动态规划。用一个n*n的数组记录每个点上下左右方向上为1的最小值。最后ans返回数组中最大的加号。解题思路二&#xff1a;优化1。解题思路三&#xff1a;0题目描述&…

word制作多个单位联合发文的文件头

一、前言 word制作多个单位联合发文的文件头&#xff0c;好像不难。但是做起来&#xff0c;却发现&#xff0c;自己的只是储备还是不够&#xff0c;居然花费了1个多小时才搞定....哎 二、遇到问题 开始思路是想使用【分栏】来操作&#xff0c;但是不得其法&#xff0c;搞了一…

驱动开发基础知识

文章目录记录驱动开发前的知识储备工作一、驱动开发环境搭建二、驱动开发框架&#xff08;重点&#xff1a;WDF框架&#xff09;1、前世今生&#xff08;1&#xff09;Vista简介&#xff08;2&#xff09;发展历史2、基于框架的驱动程序的 WDM&#xff08;1&#xff09;驱动程序…

linux(1.nginx基础 2.使用Nginx负载均衡及动静分离)

一.nginx基础 目录 1. Nginx使用场景2. Nginx中的进程 2.1 Nginx中的多进程模型2.2 多进程模式的优点&#xff1a;2.3 缓存3. Ngnix的负载均衡策略 3.1 轮询法3.2 加权轮询3.3 原地址哈希3.4 最小连接数法3.5 Fair3.6 url_hash3. Nginx配置文件4. Nginxtomcat 集群示例 4.1 下…

c++学习-STL常用函数

第八部分-STL常用函数 5.1 常用遍历算法 5.1.1 for_each 5.1.2 transform 5.2 常用查找算法 5.2.1 find 5.2.2 find_if 5.2.3 adjacent_find 面试题中如果出现查找相邻重复元素&#xff0c;记得用stl中的adjacent_find算法 5.2.4 binary_search 5.2.5 count 5.2.6 count_if 5.…

【双十一特辑】爱心代码(程序员的浪漫)-李峋

前言 最近《点燃我温暖你》中李峋的爱心代码超级火&#xff0c;看着特别心动&#xff0c;这不&#xff0c;光棍节快到了&#xff0c;给兄弟们教学一波爱心代码&#xff0c;赶在双十一前表白&#xff0c;让这个双十一不在是孤单一个人&#xff01;目录 前言 C语言简易爱心代码…