Codeforces Round #840 (Div. 2)

news2025/1/18 4:28:54

A. Absolute Maximization

题目链接:Problem - A - Codeforces

样例输入:

4
3
1 0 1
4
5 5 5 5
5
1 2 3 4 5
7
20 85 100 41 76 49 36

样例输入:

1
0
7
125

题意:给定一个长度为n的数组a[],我们可以对这个数组中的数进行操作,每次操作选择两个数i和j,然后我们可以交换a[i]和a[j]中的任意二进制位,对整个数组操作完后,问数组中最大的数减去最小的数的值最大是多少?

分析:直接贪心,我们将数组中的1尽可能集中到最大值上,将数组中的0尽可能集中到最小值上,最后直接作差即可。集中1的操作正好相当于或运算,集中0的操作相当于与运算,所以答案就是数组的或值减去与值。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
const int N=1e5+10;
int a[N];
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		scanf("%d",&n);
		int ans1=0,ans2=1023;
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
			ans1|=a[i];
			ans2&=a[i];
		}
		printf("%d\n",ans1-ans2);
	}
	return 0;
}

B. Incinerate

题目链接:Problem - B - Codeforces

样例输入: 

3
6 7
18 5 13 9 10 1
2 7 2 1 2 6
3 4
5 5 5
4 4 4
3 2
2 1 3
1 1 1

样例输出:

YES
NO
YES

题意:一开始有n个怪兽,每个怪兽有一个血量和攻击力,现在有一个人来攻击这些怪兽,这个人的初始攻击力是k。每轮战斗后怪兽的血量都会降低人的现有攻击力,但是人的攻击力也会降低,降低值就是存活的怪兽中的最低攻击力。现在问人能不能杀死全部的怪兽。

分析:容易看出,只要怪兽还没死,那么人对每个怪兽造成的伤害就是相同的,所以为了方便统计每轮战斗后剩余存活的怪兽的最低攻击力,我们可以按照攻击力对怪兽进行从小到大排序,并用一个sum来记录当前人对每个怪兽造成的伤害,对于每个怪兽,如果该怪兽的血量小于等于人造成的伤害,那么说明怪兽已经被打死,继续下一个怪兽即可,否则人就要与这个怪兽进行战斗,只要这个怪兽还没死,人每轮战斗结束后减少的攻击力就是该怪兽的攻击力,这个过程直接模拟即可,因为人的攻击力不是特别大,所以模拟的轮次不会特别多,当人的战斗力减少至0时就直接退出即可。需要注意的一点是,我们在模拟人与怪兽战斗的过程中,如果最后一次战斗把该怪兽打死了,那么人所减少的战斗力就是下一个存活的怪兽的攻击力,而不是当前已经被打死的怪兽的攻击力。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
const int N=1e5+10;
struct node{
	int hp,at;
}p[N];
bool cmp(node a,node b)
{
	return a.at<b.at;
}
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int n,k;
		scanf("%d%d",&n,&k);
		for(int i=1;i<=n;i++)
			scanf("%d",&p[i].hp);
		for(int i=1;i<=n;i++)
			scanf("%d",&p[i].at);
		sort(p+1,p+n+1,cmp);
		long long sum=0;//记录当前造成的总伤害
		bool flag=true;
		for(int i=1;i<=n;i++)
		{
			if(sum>=p[i].hp) continue;
			else
			{
				p[i].hp-=sum;
				if(i!=1) k-=p[i].at;
			}
			while(p[i].hp>0&&k>0)
			{
				sum+=k;
				p[i].hp-=k;
				if(p[i].hp>0)
					k-=p[i].at;
			}
			if(p[i].hp>0&&k<=0)
			{
				flag=false;
				break;
			}
		}
		if(flag) puts("YES");
		else puts("NO"); 
	}
	return 0;
}

C. Another Array Problem

题目链接:Problem - C - Codeforces

样例输入: 

3
3
1 1 1
2
9 1
3
4 9 5

样例输出:

3
16
18

题意:给定一个长度为n的数组a[],我们可以对这个数组进行操作,每次操作选择两个下标i,j,满足1<=i<j<=n,操作后就会使得所有的满足i<=k<=j的k都有a[k]=|a[j]-a[i]|,问操作后的数组的元素和最大是多少。

分析:我们首先可以发现a数组中的数都是非负数,那么一定有|a[j]-a[i]|<=max(a[j],a[i]),也就是说即使是操作后的数也不可能存在大于max(a[1~n])的数。

对于n>=4的情况,我们可以把所有的数均变为原数组中的最大值,那么显然这种情况是最优的。

以n=4举个例子,假如四个数是3 9 2 1,我们先对后两个数连续进行两次操作变为3 9 0 0,接下来我们选择第2个数和第4个数进行一次操作得到3 9 9 9,然后对前两个数进行两次操作得到0 0 9 9,最后选择第一个数和第四个数进行一次操作得到9 9 9 9.可以发现这个策略是万能的,所以当n>=4时我们一定有方法把数组均变为最大值。

当n=2时无非就是不操作和操作1次,那么我们取一个最大值即可

n=3时暴力讨论一下就行。

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

D. Valid Bitonic Permutations

题目链接:Problem - D - Codeforces

样例输入:

7
3 1 3 2 3
3 2 3 3 2
4 3 4 3 1
5 2 5 2 4
5 3 4 5 4
9 3 7 8 6
20 6 15 8 17

样例输出:

0
1
1
1
3
0
4788

题意:给定五个数n,i,j,x,y,问我们满足p[i]=x以及p[j]=y的长度为n的单峰排列个数。

单峰排列是指存在一个k满足1<k<n,且p[1~k]单调递增,p[k~n]单调递减。

分析:如果要是没有p[i]=x以及p[j]=y这两个限制,那么我们可以直接从n~1开始填数,也就是区间DP,设f[i][j]表示从第i个位置填到第j个位置的合法方案数,由于我们是从大到小开始填数,往两端开始添数,所以f[i][j]代表已经填了j-i+1个数,最后一个要填的数就是n-(j-i),所以我们只需要判断一个这个数能不能填在第i个位置或者第j个位置即可,所以动态规划的方程就很容易得到了,就是对于每一个当前要填的数就判断一下这个数能不能填在两端即可。加上这两个限制其实影响也不大,无非就是如果位置等于i了我们就判断一下要填的数是不是x,等于j了我们就判断一下要填的数是不是y就行了,其余的也是正常的区间DP。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
const int N=103,mod=1e9+7;
int f[N][N];//f[i][j]表示从第i个位置填到第j个位置的合法方案数
int n,l,r,x,y;
bool check(int id,int val)
{
	if(id==l) return val==x;
	else if(id==r) return val==y;
	return true;
}
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		scanf("%d%d%d%d%d",&n,&l,&r,&x,&y);
		memset(f,0,sizeof f);
		for(int i=2;i<n;i++)//先填入峰值,注意峰值不能出现在1和n这两个位置 
			if(check(i,n)) f[i][i]=1;
		for(int len=2;len<=n;len++)
		for(int l=1;l+len-1<=n;l++)
		{
			int r=l+len-1;
			//区间长度为len,那么该区间内最后一个要填入的数就是n-len+1
			if(check(l,n-len+1)) f[l][r]=(f[l][r]+f[l+1][r])%mod;//尝试填到第l个位置 
			if(check(r,n-len+1)) f[l][r]=(f[l][r]+f[l][r-1])%mod;//尝试填到第r个位置 
		}
		printf("%d\n",f[1][n]);
	}
	return 0;
}

E. Node Pairs

题目链接:Problem - E - Codeforces

 样例输入:

4

样例输出:

5 6

题意:给出一个p,让我们输出有p对点可以相互连通的有向图中的点的最小数目,在此基础上输出最多有多少单向连通的点对。

分析:为了使得点数最小,我们尽量的是构造完全图,一个点数为n的完全图中的可相互连通的点对数目是n*(n-1)/2,如果要是p不是一个完全图的点对数,我们就把他拆成多个完全图,每个完全图都尽可能点数多一些,最后点对数目凑成p即可,那么我们就可以发现这就是一个完全背包问题,直接背包求解即可。现在我们已经得到若干个完全图了,要问在此基础上最多有多少单项连通的点对,那么显然让整张有向图上除了双向连通的点对之外其余的所有的点对都单向连通时最优,而且这是显然可以做到的,随便画一个图就可以得到这个结论。不妨假设第一问的答案是m,那么第二问的答案就是m*(m-1)/2-p.因为m个点形成了m*(m-1)/2个点对,其中p个点对是双向的,其余的就都是单向的。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
const int N=1e3+10;
long long v[N],f[300003];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<N;i++)
		v[i]=i*(i-1)/2;
	memset(f,0x3f,sizeof f);
	f[0]=0;
	for(int i=1;v[i]<=n;i++)
	for(int j=v[i];j<=n;j++)
		f[j]=min(f[j],f[j-v[i]]+i);
	printf("%lld %lld",f[n],f[n]*(f[n]-1)/2-n);
	return 0;
}

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

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

相关文章

VueJs中setup的使用(上)

前言在写组合式API代码时,首先接触到的是setup这个函数,在一些项目代码里,你会看到有的直接在script标签上添加setup标识,有的在选项式API方式里,以setup()函数,配置选项的方式出现在单文件组件里什么时候用setup()函数方式,什么时候不用,对于有些新手同学,有些困惑,以及它的一…

聚观早报 | 特斯拉上海工厂被曝停产;富士相机X-Pro 3已停产

今日要闻&#xff1a;特斯拉上海工厂被曝停产&#xff1b;富士相机X-Pro 3已停产&#xff1b;字节复活红果小说App&#xff1b;网易云音乐首份乐评报告发布&#xff1b;辛巴年货节单场带货超1400万单特斯拉上海工厂被曝停产 12 月 26 日消息&#xff0c;根据一份内部通知和两位…

十八、Docker可视化管理工具Portainer

1、概述 Portainer分两个版本 开源版本&#xff1a;Portainer Community Edition (CE) 和商业版本&#xff1a;Portainer 商业版 (BE)。 CE 拥有超过 50 万的普通用户&#xff0c;是一个功能强大的开源工具集&#xff0c;可让您轻松地在 Docker、Docker Swarm、Kubernetes 和…

SpingBoot常见注解区分

1、Mapper注解&#xff1a; 作用&#xff1a;在接口类上添加了Mapper&#xff0c;在编译之后会生成相应的接口实现类 添加位置&#xff1a;接口类上面 Mapper public interface UserMapper{/*** param username 用户名* param password 密码* param memberLevelId 会员级别* p…

【Pygame实战】俄罗斯方块 | 太好玩了~停不下来,这种版本(Turtle彩版)你肯定没玩过……(经典怀旧:无人不知的俄罗斯方块)

导语 警报警报&#xff01;听说CSDN游戏专区火了火了~竟然是因为各种形状的方块。 对&#xff01;各种游戏都快烂大街了&#xff0c;俄罗斯方块咋滴就不能火一把了&#xff1f; Python版俄罗斯方块 等你来战&#xff01; 所有文章完整的素材源码都在&#x1f447;&#x1f447;…

分库分表必知

概述 为啥要进行分库分表&#xff1f; 单表数据量太大&#xff0c;比如超过5000w行&#xff0c;查询时扫描的行太多&#xff0c;SQL效率低&#xff0c;CPU出现瓶颈 数据的切分就是通过某种特定的条件&#xff0c;将存放在同一个数据库或同一个表的数据分散存放到多个数据库&a…

干货 | 数字经济创新创业——网络安全

下文整理自清华大学大数据能力提升项目能力提升模块课程“Innovation & Entrepreneurship for Digital Economy”&#xff08;数字经济创新创业课程)的精彩内容。主讲嘉宾&#xff1a;Kris Singh: CEO at SRII, Palo Alto, CaliforniaVisiting Professor of Tsinghua Unive…

在 ArcGIS 中使用函数块给字段赋随机值 (指定范围内随机编号)

在 ArcMap 或 ArcGIS Pro 中通过使用字段计算器,给字段赋随机值。 通过字段计算器内置的 VB、Python 方法可以构建函数块表达式实现各种各样的赋值操作,下面我们来看看通过使用内置的 Python 函数块来实现随机赋值。 (也可以制作成工具箱哦,更加方便) ArcMap 生成随机值…

智能开关继电器-选型篇2

继电器在智能开关中承担着开通、关断的功能&#xff0c;是开关产品最根本的一项功能。这样一个关键的器件我们将分为两个篇章进行撰写&#xff1a;选型篇1、选型篇2、评估篇。其中选型篇1简述继电器的定义、分类&#xff0c;可参考《智能开关继电器-选型篇1》。选型篇2会在基于…

【TypeScript】类型声明文件的讲解与使用

目录 简介 文件类型 类型声明文件使用 简介 我们发现今天所有的JS应用都会引入许多第三方库来完成任务需求。这些第三方库无论是否是TS编写的最终都会编译成JS代码给开发者使用。我们知道TS提供了类型才有了代码提示和类型保护机制&#xff0c;但我们引入的第三方库都会有相…

搞懂 Spark 系列之 Spark Shuffle 的前世今生

注&#xff1a;本文已首发于PowerData公众号&#xff01; 1 Spark Shuffle 是什么&#xff1f; Shuffle 中文意思是“洗牌&#xff0c;混洗”&#xff0c;而在 Hadoop 的 MapReduce 框架中&#xff0c;Shuffle 是 Map 和 Reduce 中间必不可少的连接桥梁。数据在从Map 阶段结束…

优化器核心技术—Join Reorder

Join Reorder 的简介 Join Reorder 是开务数据库 SQL 优化器中的核心优化算法&#xff0c;开务数据库优化器包括 RBO 和 CBO 两部分&#xff0c;负责计划优化&#xff0c;提升 SQL 执行性能。Join Reorder 能够保证在复杂查询执行的场景下&#xff0c;枚举合法的执行路径&…

分布式系统稳定性建设指南

来源&#xff1a; 中国信息通信研究院 系统稳定性能建设是一个系统化工程&#xff0c;需要硬件软件&#xff0c;需要从企业工程建设的全环节进行设计和实施&#xff0c;充分利用以混沌工程、全链路压测为代表的分布式稳定性保障技术&#xff0c;建设保障能力&#xff0c;改造运…

域名系统 DNS(计算机网络-应用层)

目录 互联网的域名结构 顶级域名 TLD(Top Level Domain) 域名服务器 域名系统 DNS 域名解析的过程 域名服务器的四种类型 本地域名服务器 DNS 协议 DNS缓存 DNS提供的其它服务 互联网的域名结构 域名系统 DNS (Domain Name System)&#xff0c;实现主机名&#xff08;域…

(三)HTTPTomcatServlet

一、HTTP HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则。 HTTP协议特点&#xff1a; &#xff08;1&#xff09;基于TCP协议&#xff1a;面向连接&#xff0c;安全 &#xff08;2&#xff09;基于请求-响应模型的…

漫画 | JavaScript杀死了编程......

上班路上&#xff0c;张大胖突然想到一个点子。晚上&#xff0c;张大胖开工&#xff0c;决定把好点子给实现了。JavaScript开发效率贼高&#xff0c;项目迅速完成。项目开源发布&#xff0c;获得了不少用户&#xff0c;收获了不少star&#xff0c;张大胖非常满意。转眼间&#…

【GlobalMapper精品教程】039:GM面状数据符号化设置案例教程

GM面状数据符号化设置案例教程。 文章目录 一、使用基于分类或自定义样式的默认样式二、对所有要素使用相同样式三、基于属性/名称值应用样式四、随机指定颜色给要素一、使用基于分类或自定义样式的默认样式 该样式类似于其他GIS软件的单一样式,即为数据加载的默认样式。加载…

Stable Diffusion攻略集(Stable Diffusion官方文档、kaggle notebook、webui资源帖)

文章目录第一部分一、 Features&#xff1a;Textual Inversion&#xff08;文本反转&#xff09;1.1 Textual Inversion 简介1.1.1 摘要1.1.2 算法1.1.3 模型效果1.2 Textual Inversion of webai1.2.1 预训练embedding用于图片生成1.2.2 训练embedding1.2.3 Finding embeddings…

【Redis】知识体系结构构建以及常见考题汇总

【Redis】知识体系结构构建以及常见考题汇总1、思维导图2、Redis体系结构&#xff1a;原理、部署2.1、Redis实现原理2.1.1、Redis中数据结构2.1.2、不同对象的数据类型&#xff08;基本类型、特殊类型&#xff09;2.2、Redis部署2.2.1、基本配置&#xff08;缓存的更新、删除和…

【Linux】基础命令

目录 1.ls指令 2.pwd指令 3.cd指令 4.touch指令 5.mkdir指令 6.rmdir指令 && rm 指令 7.man指令 8.cp指令 9.mv指令 10.cat指令 11.less指令 12. head和tail 13.date指令 14.grep指令 15.bc指令 16.重要的几个热键 1.ls指令 语法&#xff1a;ls 选项 …