Codeforces Round 894 (Div. 3)

Gift Carpet(Problem - A - Codeforces)

题目大意:有一块儿地毯,上面有n行m列的字符,如果从左往右一列一列的读,可以读到“vika”,那么就输出yes,否则输出no。

思路:这里显然有个顺序,那么就很简单,不用考虑分配的问题了,直接一列一列地找就可以了。 mm

#include<bits/stdc++.h>
using namespace std;
char s[30][30];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n,m;
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
		int flag=1;
		for(int i=1;i<=m;i++)
		{
			for(int j=1;j<=n;j++)
			{
				if(flag==1&&s[j][i]=='v')
				{
					flag=2;
					break;
				}
				if(flag==2&&s[j][i]=='i')
				{
					flag=3;
					break;
				}
				if(flag==3&&s[j][i]=='k')
				{
					flag=4;
					break;
				}
				if(flag==4&&s[j][i]=='a')
				{
					flag=5;
					break;
				}
			}
		}
		if(flag==5) printf("YES\n");
		else printf("NO\n");
	}
}

Sequence Game(Problem - B - Codeforces)

题目大意:对于一个序列a[],我们用如下地方式生成一个序列b[]:
挑选a[1]
挑选a[i],并使a[i]满足a[i-1]<=a[i],
现给出b[],需要输出一个可能的a[]

思路:很显然如果b[]中的数第一个一定是a[]中的数,如果后一个大于前一个,那么就不用插入别的数,否则在不满足的位置前插入一个相同的数即可。

#include<bits/stdc++.h>
using namespace std;
int a[200010];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n;
		scanf("%d",&n);
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		vector<int>b;
		b.push_back(a[1]);
		for(int i=2;i<=n;i++)
		{
			if(a[i]>=b.back())b.push_back(a[i]);
			else 
			{
				b.push_back(a[i]);
				b.push_back(a[i]);
			}
		}
		printf("%d\n",b.size());
		for(auto i:b) cout<<i<<" ";
		printf("\n");
	}
}

Flower City Fence(Problem - C - Codeforces)

题目大意:给定一些木板,它们原本是从高到低竖着排列的,现在要求它们横着摆放,问得到的围栏是否和之前的相同。

另外[3,1,1]也是可以的。

思路:我们来看,竖着摆放的时候显然用的就是木板的高度,而横着摆放的时候的高度实际是木板的数量。如上图,竖着摆放时的最高为5,那么相当于有且仅有5个能够同时减1,[3,1,1]则是有且仅有3个能够同时减3.原本的高度就变成了能够横着延伸多远。横着放的时候,最初的高度是n,最短的那个长度是几,那么就是有多少个n,最短的那个有d个,那么下一个高度就是n-d,我们可以用vector<pair<int,int>>将两者产生的围墙记录下来,然后排序判断是否相等。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n;
		scanf("%d",&n);
		map<int,int>mp;
		for(int i=1;i<=n;i++) 
		{
			int x;
			scanf("%d",&x);
			mp[x]++;
		}
		int l=n;
		vector<pair<int,int>>p1,p2;
		int c=0;
		for(auto it:mp)
		{
			int h=it.first,v=it.second;
			p1.push_back({h,v});
			p2.push_back({l,h-c});//这里的数量是要把之前已经访问过的减掉
			l -= v;
			c += h-c;
		}
		sort(p1.begin(),p1.end());
		sort(p2.begin(),p2.end());
		if(p1==p2) printf("YES\n");
		else printf("NO\n");
	}
}

Ice Cream Balls(Problem - D - Codeforces)

题目大意:现在需要制作n个不同类型的双球冰淇淋,已知{1,1,2}可以制作{1,1}和{1,2},两种类型的冰淇淋,{1,2}可以制作{1,2}一种类型的冰淇淋,{1}什么都不可以,{1,1}可以制作{1,1}一种类型的冰淇淋。问如果恰好制作n种不同类型的冰淇淋,至少需要购买多少冰淇淋球。

思路:这题最关键的一点在于恰好,k种不同类型的冰淇淋球可以制作k*(k-1)/2种不同类型的冰淇淋,那么我们可以找出制作数小于等于n的最大的k,然后不够的补一下即可。

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int check(int mid)
{
	int ans=mid*(mid-1)/2;
	if(ans<=n) return 1;
	else return 0;
}
signed main()
{
	int t;
	scanf("%lld",&t);
	while(t--)
	{
		scanf("%lld",&n);
		int l=1,r=2e9;
		while(l<r)
		{
			int mid=(l+r+1)/2;
			if(check(mid)) l=mid;
			else r=mid-1;
		}
		r += n-r*(r-1)/2;
		printf("%lld\n",r);
	}
}

Kolya and Movie Theatre(Problem - E - Codeforces)

题目大意:现在新开了一家电影院,一共有n部电影,每天上映一部,小k每天可以看一部,最多看m天,每部电影有一个娱乐值,而小k隔得越久去电影院,实际获得的娱乐值越小。举个例子,d=2,a=[3,2,5,4,6],那么如果选择看第一部电影,实际的获取的娱乐值就是3-(1-0)*2,如果看完第一部电影后再去看第三部电影,那么从第三部电影中获取的娱乐值就是5-(3-1)*d,如果只看这两部电影,那么总的娱乐值就是两者的和。

思路:这里娱乐值要改变显然很麻烦,我们看看实际减少的量是什么,如上例子中实际减少的是(1-0+3-1)*d=3*d,多看几个样例就会发现,这个减少的值就是选择的天数中,最后一天的下标乘d。那么我们可以来讨论以谁作为最后一天,进而找出最大值。这里还需要维护第i天之前最多选m-1天得到的娱乐值最大,那么显然就是当之前选择的超过m天后,将娱乐值小的弹出来,那么用优先队列维护就行。另外注意可能会爆int

#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[200010];
signed main()
{
	int t;
	scanf("%lld",&t);
	while(t--)
	{
		int n,m,d;
		scanf("%lld%lld%lld",&n,&m,&d);
		for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
		int sum=0,mx=0;
		priority_queue<int,vector<int>, greater<int>>p;
		for(int i=1;i<=n;i++)
		{
			if(a[i]<0) continue;
			while(p.size()>m-1) 
			{
				sum-=p.top();
				p.pop();
			}
			sum += a[i];
			mx=max(mx,sum-i*d);
			p.push(a[i]);
		}
		cout<<mx<<endl;
	}
}

Magic Will Save the World(Problem - F - Codeforces)

题目大意:现在有n个怪兽,小v每秒可以积攒w单位水能量和f单位火能量,每个怪兽有一个生命值,小v杀死一只怪兽只能用一种能量,问小v想要杀死所有的怪兽最少需要多少秒。

思路:显然,对于小v来说,她可以不断积攒能量然后在最后一秒再发动攻击。和她在过程中发动攻击是等价的。那么实际上就是将这些怪兽分成两堆,一堆的生命值总和小于总的火能量,一堆生命值的总和小于总的水能量,要求最少,那么二分即可。我们该如何实现check函数呢,首先可以利用01背包预处理出来从n个数中任选可以组成哪些数,sum-c(c为可以组出来的数)则为另一堆,只需要判断在当前情况下是否存在两堆生命值一堆小于火能量总和,一堆小于水能量总和即可。

#include<bits/stdc++.h>
using namespace std;
using namespace std;
#define int long long
int dp[1000010],a[100010];
int w,f,sum;
int check(int mid)
{
	int ax=w*mid,bx=f*mid;
	for(int i=min(sum,ax);i>=1;i--)//这里sum可能小于ax,但是也可能大于,所以我们在两者中取小
	{
		if(dp[i])
		{
			if((i<=ax&&sum-i<=bx)||(i<=bx&&sum-i<=ax)) return 1;
		}
	}
	return 0;
}
signed main()
{
	int t;
	scanf("%lld",&t);
	while(t--)
	{
		scanf("%lld%lld",&w,&f);
		int n;
		scanf("%lld",&n);
		sum=0;
		for(int i=1;i<=n;i++) scanf("%lld",&a[i]),sum+=a[i];
		memset(dp,0,sizeof dp);
		dp[0]=1;
		for(int i=1;i<=n;i++)
		{
			for(int j=sum;j>=a[i];j--)
			{
				dp[j]+=dp[j-a[i]];
			}
		}
		int ti=(sum/w+1,sum/f+1);
		int l=1,r=ti;
		while(l<r)
		{
			int mid=(l+r)/2;
			if(check(mid)) r=mid;
			else l=mid+1;
		}
		cout<<l<<endl;
	}
}

ps:这题差不多是先由最小联系到二分,再由二分的条件联系到分堆,再由分堆联系到通过01背包找所有合法的情况进而分堆,至此题目解决。剩下的就是一些细节上的问题了。

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

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

相关文章

【RuoYi-Vue-Plus学习】项目初始化时将sql导入数据库出现Finished with error解决方法之一

将sql导入数据库出现Finished with error&#xff0c;文末是最终解决方法。 问题描述&#xff1a;sql导入出现Finished with error 解决方法探索过程&#xff1a; 1&#xff09;参考链接2和3&#xff0c;在mysql的bin目录下输入以下指令连接数据库 mysql -h localhost -u ro…

第25讲:顺序表专题

1.什么是数据结构 2.顺序表概念及结构 3.顺序表分类 4.实现动态顺序表 1.什么是数据结构 数据结构是计算机存储、组织数据的方式。可以用来完成通讯录项目。 2.顺序表概念及结构 2.1线性表 线性表是n个具有相同特性的数据元素的有限序列 常见的线性表&#xff1a;顺序表…

智能监控系统EasyCVR设备录像无法下载是什么原因?该如何解决?

视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#…

【React教程】(2) React之JSX入门与列表渲染、条件渲染详细代码示例

目录 JSX环境配置基本语法规则在 JSX 中嵌入 JavaScript 表达式在 JavaScript 表达式中嵌入 JSXJSX 中的节点属性声明子节点JSX 自动阻止注入攻击在 JSX 中使用注释JSX 原理列表循环DOM Elements 列表渲染语法高亮 条件渲染示例1&#xff1a;示例2&#xff1a;示例3&#xff08…

递归方法的理解,什么时候递,什么时候归

简单总结一下递归。递归就是在运行的过程中调用自己。递归需要有一个出口&#xff0c;如果无限递归是没有意义的&#xff0c;而且递归到一定程度&#xff0c;程序就会由于栈内存溢出导致程序报错。 我们先来看段代码&#xff1a;建议大家先思考这个代码在控制台输出的结果是什…

性能测试+Jmeter介绍

文章目录 什么是性能测试?性能测试的目的性能测试分类一般性能测试负载测试压力测试大数据量测试配置测试稳定性测试 性能测试术语虚拟用户并发及并发用户数响应时间每秒事务数吞吐量、吞吐率点击率性能计数器资源利用率 性能测试流程测试计划阶段测试设计阶段测试开发阶段测试…

SQL中实现行列转换

目录 方法一&#xff1a;sum case when 方法二&#xff1a;sum if 方法三&#xff1a;pivot 现在有一张表class_gender&#xff0c;内容如下&#xff1a; classgender一年级女一年级女一年级男一年级男二年级女二年级女二年级男 现在我们要根据上表&#xff0c;统计得到下…

Redis常用数据结构与应用场景

常用数据结构 StringHashListSetZset String常用操作 String应用场景 Hash常用操作 hash应用场景 Hash结构优缺点 优点 同类数据归类整合存储,方便数据管理相比String操作消耗内存与spu更小相比string更节省空间 缺点 过期功能不能使用在field上,只用用在key上Redis集群…

java学习之路(2)-编译java文件运行Java文件

创建.java后缀文本文件HelloWorld .java 写入代码&#xff1a; public class HelloWorld { public static void main(String []args) { System.out.println("Hello World"); } } 运行cmd命令 找到代码所在目录 输入javac编译Java文件生成HelloWorld.class 编译:…

CentOS 7 部署 ZeroTier Moon 节点

ZeroTier是一套使用UDP协议构建的SD-WAN网络软件&#xff0c;其主要有三部分组成&#xff1a;行星服务器Planet、月亮服务器Moon、客户端节点LEFA&#xff0c;行星服务器是ZeroTier的根节点&#xff0c;可以采用ZeroTier官方的服务器&#xff0c;也可以使用开源代码自行搭建 月…

Android中下载 HAXM 报错 Intel® HAXM installation failed,如何解决?

最近在搭建 Flutter 环境&#xff0c;但是在 Android Studio 中安装 Virtual Device 时&#xff0c;出现了一个 问题 Intel HAXM installation failed. To install Intel HAXM follow the instructions found at: https://github.com/intel/haxm/wiki/Installation-Instructio…

深度强化学习(王树森)笔记09

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

【Servlet】Smart Tomcat插件简化Servlet开发流程及解决常见问题

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Servlet】 本专栏旨在分享学习Servlet的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、Smart Tomcat插件二…

【2023地理设计组一等奖】基于GIS的桥梁隧道三维建模与可视化

作品介绍 1 设计背景和意义 随着我国基础建设规模不断扩大和深入,构建桥梁可视化管理模型,全面推动智慧桥梁,已成为现代隧道桥梁建设行业的发展趋势。传统的桥梁建模工作需要复杂的算法设计并需要熟练编程实践技能,实现周期长。开发自主知识版权的桥梁建模软件系统或专用插…

时间复杂度解释

时空复杂度概述 首先o(1), o(n), o(logn), o(nlogn)是用来表示对应算法的时间复杂度,这是算法的时间复杂度的表示。不仅仅用于表示时间复杂度&#xff0c;也用于表示空间复杂度。 算法复杂度分为时间复杂度和空间复杂度。其作用&#xff1a; 时间复杂度是指执行这个算法所需要…

Keepalived + DR 集群

目录 1、Keepalive VRRP 说明 故障切换 工作原理 核心组件 2、Keepalived DR 集群 拓扑规划 前期准备 配置 Httpd 服务 配置 Nginx 服务 配置 LVS 主 node_01 配置 LVS 从 node_02 测试 LVS 集群 测试主备切换 3、Keepalived 脑裂现象 4、Keepalived 心态检测 …

C++字符串的常用操作函数全总结

文章目录 1.string、string.h和cstring的区别2.字符串定义3.求字符串的长度&#xff08;也可以求array对象长度&#xff09;4.输入字符串5.分割截取字符串4.在字符串中查找指定子字符串,并返回其第一次出现的位置5.替换字符串中的一部分6.在字符串指定位置插入字符串7.复制字符…

【漏洞通告】 Jenkins CLI 任意文件读取漏洞

漏洞概况 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。Jenkins 有一个内置的命令行界面&#xff08;CLI&#xff09;&…

安装elasticsearch、kibana、IK分词器

1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net 1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的镜像&#xff0c;这个镜像体积非常大&#xff0…

在Spring Boot中使用iTextPDF创建动态PDF文档

最近&#xff0c;我们的系统新增了一个客服模块&#xff0c;其中一个重要功能是能够以PDF格式导出客服与用户之间的聊天记录。这些聊天记录包含文字、图片和文件等多种内容。为了实现这一功能&#xff0c;我们首先使用了itextpdf 5.x版本制作了一个Demo。今天&#xff0c;我将与…