Codeforces Round 605 (Div. 3) A~D

news2024/9/20 14:39:24

本人水平不高,开这个专栏主要是督促自己补题,有些题对目前的我来说还比较难,还补不动,等以后能力上来了再补。。。

原题链接:Dashboard - Codeforces Round 605 (Div. 3) - Codeforces

目录

A. Three Friends

B. Snow Walking Robot

C. Yet Another Broken Keyboard

D. Remove One Element


A. Three Friends

让三个人尽可能接近,让左边的人和右边的人尽量往中间靠,a与b的距离| a-b |会减1,b与c的距离| b-c |也会 减1,而a与c的距离| a-c |会 减2。但是又因为是三个绝对值的式子相加,所以这三个式子之和必然大于等于0,取max(0ll,abs(a-b)+abs(b-c)+abs(a-c)-4) 即可。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'

void solve() {
	int a, b, c; cin >> a >> b >> c;
	cout << max(0ll, abs(a - b) + abs(b - c) + abs(a - c) - 4) << endl;
}

signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int T; cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}

B. Snow Walking Robot

让机器人走一个(先向左再向上再向右再向下的)L—>U—>R—>D的矩形即可。

选择矩形的原因是“凹”形(下图左半部分)相比于与其效果相同的矩形,浪费了两个AB的长度。而“凸”形(下图右半部分)等价于虚线的矩形,而矩形比“凸”形简单,所以选择矩形。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'

void solve() {
	string s; cin >> s;
	int l=0, r=0, u=0, d = 0;
	for (auto i : s) {
		if (i == 'L') l++;
		else if (i == 'R') r++;
		else if (i == 'U') u++;
		else if (i == 'D') d++;
	}
	int x = min(l, r), y = min(u, d);
	if (x && y) {
		cout << 2 * x + 2 * y << endl;
		for (int i = 1; i <= x; i++) cout << 'L';
		for (int i = 1; i <= y; i++) cout << 'U';
		for (int i = 1; i <= x; i++) cout << 'R';
		for (int i = 1; i <= y; i++) cout << 'D';
	}else if (x) {
		cout << 2 << endl << "LR";
	}else if (y) {
		cout << 2 << endl << "UD";
	}else if (x == 0 && y == 0) {
		cout << 0 << endl;
	}
	cout << endl;
}

signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int T; cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}

C. Yet Another Broken Keyboard

写法一:

开一个标记数组f[26]表示从'a'~'z’的字母是否是好的,如果是好的标记为1,否则为0。

遍历字符串s,开一个计数的变量cnt,初始化为0。当遇到好的字母(也就是f[s[i]-'a']为1),让cnt++。否则让ans+=cnt*(cnt+1)/2,并重新让cnt=0。因为末尾的那段不会在循环中被累加,所以在循环外我们还需要让ans再累加一次cnt*(cnt+1))/2 。

写法二:

可以用set代替标记数组。一开始将好的字母都存到set,后面使用set的s.find()函数(s.find() !=s.end() )来判断字符串中的字母是否是好的。

写法一代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
int f[26];

signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int n, k; cin >> n >> k;
	string s; cin >> s;
	while (k--) {
		char c; cin >> c;
		f[c - 'a' ] = 1;
	}
	int cnt = 0, ans = 0;;
	for (int i = 0; i < n; i++) {
		if (f[s[i]-'a']) {
			cnt++;
		}
		else {
			ans += cnt * (cnt + 1) / 2;
			cnt = 0;
		}
	}
	ans += cnt * (cnt + 1) / 2;
	cout << ans << endl;
	return 0;
}

写法二代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
set<char> a;

signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int n, k; cin >> n >> k;
	string s; cin >> s;
	while (k--) {
		char c; cin >> c;
		a.insert(c);
	}
	int cnt = 0, ans = 0;;
	for (int i = 0; i < n; i++) {
		if (a.find(s[i]) != a.end()) {
			cnt++;
		}
		else {
			ans += cnt * (cnt + 1) / 2;
			cnt = 0;
		}
	}
	ans += cnt * (cnt + 1) / 2;
	cout << ans << endl;
	return 0;
}

D. Remove One Element

既然是求最长上升子序列,那必然是dp。由题意知,可以删除一个或者不删除。

1. 如果不删除,就是最长连续上升子段:

for(int i = 1;i <= n;i++) {

        if(a[i] > a[i - 1]) dp1[i] = dp1[i - 1] + 1;

        else dp1[i] = 1;

}

 for(int i = n;i >= 1;i--){

        if(a[i] < a[i + 1]) dp2[i] = dp2[i + 1] + 1;
        else dp2[i] = 1;

}

2. 如果要删除,我们就枚举要删除的数:

枚举下标i,如果删除掉 i 时,剩下的能连续(a[i-1]<a[i+1]),我们就可以将以a[i-1]为结尾最长连续上升子段和以a[i+1]为开头最长连续上升子段连接起来,长度为dp1[i-1] + dp2[i+1]。

注意事项:

1. 要求的是最长连续上升子段,而不是最长连续不下降子段(也就是1 1 1 1 这个最长子段长度为1)

2. 也可以不用删除数。(1 2 3 4 这个最长子段长度为4)

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 2e5 + 10;
int a[N], dp1[N], dp2[N], ans;

signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int n; cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];
	for (int i = 1; i <= n; i++) {
		if (a[i] > a[i - 1]) dp1[i] = dp1[i - 1] + 1;
		else dp1[i] = 1;
	}
	for (int i = n; i >= 1; i--) {
		if (a[i] < a[i + 1]) dp2[i] = dp2[i + 1] + 1;
		else dp2[i] = 1;
	}
	for (int i = 1; i <= n; i++) {
		if (a[i - 1] < a[i + 1]) ans = max(ans, dp1[i - 1] + dp2[i + 1]);
		else ans = max({ ans,dp1[i],dp2[i] });
	}
	cout << ans << endl;
	return 0;
}

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

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

相关文章

✨✨使用vue3打造一个el-form表单及高德地图的关联组件实例✨

✨1. 实现功能 &#x1f31f;表单内显示省市县以及详细地址 点击省市县输入框时&#xff0c;打开对应地图弹窗&#xff0c;进行位置选择选择位置回显入对应输入框表单内的省市县以及地址输入框同外嵌表单走相同的校验方式触发校验后点击reset实现清除校验与清空数据 &#x1f…

Web开发小知识点(二)

1.关于取余 我在Dart语言里&#xff08;flutter项目&#xff09; int checkNum (10 - 29) % 10; 那么checkNum等于1 但是在Vue项目里 const checkNum (10 - 29) % 10;却等于-9 语言的特性不同&#xff0c;导致结果也不同&#xff0c;如果要想和Dart保持一致&#xff0c;…

Task Office for Mac v9.0激活版:任务管理新境界

还在为繁琐的任务管理而烦恼吗&#xff1f;Task Office for Mac为您带来全新的任务管理体验。简洁明了的界面设计&#xff0c;让您轻松上手&#xff1b;强大的任务管理和项目管理功能&#xff0c;让您轻松掌握任务进度&#xff1b;多用户协作功能&#xff0c;让团队协作更加高效…

自定义实现 Java17+SpringBoot3+OpenAPI+Knife4j Starter

文章目录 前言正文1 创建starter项目1.1 依赖文件1.2 配置信息 2 自定义starer代码开发2.1 配置字段的定义2.2 自动配置类 3 验证starter3.1 测试项目的配置3.2 功能配置 application.yml3.3 测试代码3.3.1 实体类3.3.2 控制器13.3.2 控制器2 4 效果展示4.1 主页4.2 实体类列表…

day08-面向对象高级

1.代码块 1.1代码块引出 有时我们在使用构造方法时&#xff0c;除了进行属性的初始化外还需要使用一些其他的语句&#xff0c;以便更好的实现程序的功能&#xff0c;比如添加一些输出语句&#xff1b; 1.2 局部代码块 public void show(){System.out.println("show&quo…

Line Buffer概述

buffer在芯片物理上一般指的是SRAM&#xff0c;也可以指寄存器组。buffer的作用是用来在逻辑芯片上暂时存储数据&#xff0c;但不会是大量的数据。如果是大量数据一般会使用DRAM&#xff08;典型的指DDR&#xff09;作为存储芯片&#xff0c;用来存储大密度数据。line buffer可…

物流单打印机怎么调格式距离,佳易王物流托运单管理系统软件打印单据左边距调节教程

物流单打印机怎么调格式距离&#xff0c;佳易王物流托运单管理系统软件打印单据左边距调节教程 一、前言 以下软件操作教程以&#xff0c;佳易王物流单打印管理软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、佳易王物流单管理系统打印…

先进电机技术 —— 控制策略综述

一、先进电机控制策略综述 电机控制策略随着电力电子技术和微处理器技术的发展而日趋丰富和完善&#xff0c;各种先进的控制方法被广泛应用于直流电动机、交流电动机&#xff08;同步电机、感应电机&#xff09;等多种电机类型。下面是对几种主要先进电机控制策略的概述&#x…

ExcelVBA在选择区域(有合并)中删除清除空行

【问题】 关于删除空行&#xff0c;以前是用函数来完成工作的&#xff0c; 今天有人提出问题&#xff0c;传来这个文件&#xff0c; 现有数据&#xff0c;1w多行&#xff0c;其中有部分列有不同合并单元格&#xff0c;跨行也不一样。如果要进行筛选删除空行&#xff0c;有一定的…

工程师工具箱系列(1)MapStruct

文章目录 工程师工具箱系列&#xff08;1&#xff09;MapStruct芸芸众生初窥门径引入POM依赖创建转换器与方法进行使用IDEA好基友 游刃有余示例说明避免编写重复转换器实现复杂灵活转换 温故知新 工程师工具箱系列&#xff08;1&#xff09;MapStruct 芸芸众生 在Java项目开发…

2024年深圳市教师招聘报名流程(建议电脑)

2024年深圳市教师招聘报名流程&#xff08;建议电脑&#xff09; #深圳教师招聘 #深圳教招 #深圳教师招聘考试 #教师招聘报名照片处理 #深圳教师招聘笔试

法语语式与时态总结,柯桥零基础学法语

常用语式 法语中的常用语式分为&#xff1a;直陈式、条件式、虚拟式、命令式、不定式与分词式。 直陈式&#xff08;lindicatif&#xff09;初学法语时首先就要学直陈式&#xff0c;也是最常用的语式&#xff0c;表示确实发生的动作。 条件式&#xff08;le conditionnel&am…

动态规划----股票买卖问题(详解)

目录 一.买卖股票的最佳时机&#xff1a; 二.买卖股票的最佳时机含冷冻期&#xff1a; 三.买卖股票的最佳时期含⼿续费&#xff1a; 四.买卖股票的最佳时机III: 五.买卖股票的最佳时机IV: 买卖股票的最佳时机问题介绍&#xff1a;动态规划买卖股票的最佳时机是一个经典的…

LeetCode 题目 119:杨辉三角 II

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任字节跳动数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python&#xff0c;欢迎探讨交流 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题…

Windows11“重置此电脑”后,Edge浏览器在微软应用商店显示“已安装”,但是开始菜单搜索不到的解决办法

Windows11“重置此电脑”后&#xff0c;Edge浏览器在微软应用商店显示“已安装”&#xff0c;但是开始菜单搜索不到的解决办法 为什么重新使用Edge&#xff1f;问题描述不该更新可用更新问过AI&#xff08;通义千问&#xff09;&#xff0c;并且AI提供方法全都无效。现象 操作步…

python3如何安装bs4

在python官网找到beautifulsoup模块的下载页面&#xff0c;点击"downloap"将该模块的安装包下载到本地。 将该安装包解压&#xff0c;然后在打开cmd&#xff0c;并通过cmd进入到该安装包解压后的文件夹目录下。 在该文件目录下输入"python install setup.py&quo…

nss刷题(2)

1、[NSSCTF 2022 Spring Recruit]ezgame 打开题目是一个游戏界面 发现是有分数的&#xff0c;猜测分数达到某个之后可以获得flag&#xff0c;查看源码看一下 看到末尾显示分数超过65后显示flag 在js中找到了一个score,将他的值改为大于65的数后随意玩一次就可以得到flag同时&a…

Python使用Rembg库去除图片背景

一、引入Rembg库 #库地址 https://github.com/danielgatis/rembg#CPU使用 pip install rembg # for library pip install rembg[cli] # for library cli#GPU使用&#xff08;系统支持onnxruntime-gpu&#xff09; pip install rembg[gpu] # for library pip install rembg[gp…

JAVA 集合(单列集合)

集合框架 1.集合的特点 a.只能存储引用数据类型的数据 b.长度可变 c.集合中有大量的方法,方便我们操作 2.分类: a.单列集合:一个元素就一个组成部分: list.add(“张三”) b.双列集合:一个元素有两部分构成: key 和 value map.put(“涛哥”,“金莲”) -> key,value叫做键值…

常用Linux命令详细总结

一、文档编辑、过滤、查看命令 1、cp 复制文件和目录 -a 复制文件并保持文件属性 -d 若源文件为链接文件&#xff0c;则复制链接文件属性而非文件本身 -i 覆盖文件前提示&#xff0c;如果不要提示&#xff0c;在命令前加上\ -r 递归复制&#xff0c;通常用于目录的复制 …