寒假思维训练计划day16 A. Did We Get Everything Covered?

2024-01-29 18:52

本文主要是介绍寒假思维训练计划day16 A. Did We Get Everything Covered?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天更新一道1月27号晚上div2的C题作为素材,感觉用到了我的构造题总结模型,我总结了一系列的模型和例题。


摘要:

Part1  定义"边界贪心法"

Part2  题意 

Part3  题解

Part4  代码

Part5  思维构造题模型和例题


Part1 边界贪心法(该题所用到的模型):

边界贪心法:对于整体而言,我们去除已经定好的情况,剩下难以确定的情况,我们从其最边缘的位置去考虑、去假设;一般要在问题的最边界处考虑,一般最边界决定总体的走向,后面会给例题以及其它的模型及其例题。 


Part2 题意:Problem - A - Codeforces

题意:

给定n,k,m,再给定一个长度为m的字符串S,该字符串满足只包含前k个小写字母字符, 要求判断能否找到所有的长度为n且字符组成只包含前k个小写字母字符的字符串为S的子序列(删除一些元素后,其余元素顺序不变而组成的序列),能输出"YES",不能输出"NO",并构造出该字符串,它满足不是S的子序列。


Part3 题解:

题解:

1、已知:
n,k,m, S, len(S) = m, S[i] \epsilon ['a', 'a' + k - 1], 1<= n,k <= 26,\\1 <= m <= 1000

2、我们不妨从头到尾遍历,当满足len(set(s[i], s[i + 1], ... , s[j])) = k划分一个块,即块中元素恰好包含了所有的前k个元素,当出现len(set(s[i], s[i + 1], ... , s[j])) < k必然是最后一个块,因为它往后无法得到全部元素,一直到最后才能满足,否则就可以一直往后合并。

3、接下来,我么分好了块,假设有:block_1, block_2, block_3, ..., block_{cnt}表示分出的块,

我们进行分类讨论\left\{\begin{matrix} YES, cnt >= n\\ NO, cnt < n\end{matrix}\right.
3.1 当cnt >= n那我们必然能从每个块分别拿出任意字符,组成长度为n的子序列。
3.2 当cnt < n,此时我们证明一定是无解的,

        3.2.1 首先我们证明第一个命题,所有满足len(set(s[i], s[i + 1], ... , s[j])) = k块的最后一个元素必然只存在一个在当前块中:当最后一个元素有两个,我们必然可以让块的右边界往左边移动,矛盾。

        3.2.2  证明从前往后每次取块中最后一个元素的序列一定是唯一的:已知有block_1, block_2, block_3, ..., block_{cnt},1 <= cnt < n, 其中满足len(set(s[i], s[i + 1], ... , s[j])) = k的是:block_1,block_2,....block_t, t == cnt \quad or \quad t == cnt- 1 \\ string = s_1 + s_2 + s_3 + ... + s_t,当舍弃最后一个块的元素s_t,我们知道该块中仅仅只有一个这样的元素(由3.2.1得), 只能在前面的块找到 s_{t-1} + s_t,显然s_{t-1}也只由一个在块中,所以一直往前,必然无法找到新的可替代的string,所以string唯一。

        3.2.3  所以取每个块的最后一个元素得到的string,len(string) < n,并且它是唯一的,我们只需要在后面补上任意元素,使得len(string)==n就一定不是S的子序列。


Part4 代码(C++) 

C++代码(边界贪心法): 

#include <bits/stdc++.h>
#define int long long 
#define ff first 
#define ss second 
using namespace std; 
using PII = pair<int, int>; 
constexpr int N = 1e6 + 10;
constexpr int inf = 0x3f3f3f3f; 
int n, k, m; 
// int us[N][30], uss[N][30]; 
void solve() {cin >> n >> k >> m;string s; cin >> s; string ans = ""; int o = 0; for(int i = 0; i < m; i ++ ) {set<char> se; se.insert(s[i]); int j = i; while(se.size() < k && j + 1 < m) {++ j; se.insert(s[j]); }if(se.size() < k) {for(int j = 0; j < k; j ++ )if(se.count(('a' + j)) == 0) {ans += ('a' + j); break; }}else o ++, ans += s[j]; i = j; }if(o >= n) cout << "YES" << endl; else {cout << "NO" << endl; while(ans.size() < n) ans += 'a'; cout << ans << endl;}
}
signed main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int ts; cin >> ts; while(ts -- ) solve(); return 0;
}

Part5 思维构造题模型和例题

1、前后缀贪心,比如说观察前后缀的sum,去看以后怎么考虑最好。Problem - 1903C - Codeforces

2、双指针贪心法,考虑两端相消或者相互作用,还有就是考虑左右边界。   Problem - 1891C - Codeforces

Problem - 1907D - Codeforces

3、转换观察法,有些关系可以抽象成图,观察图的某些性质去总结规律。也可以抽象成一个集合,两个集合相等可以说明有解可构造。Problem - 1891C - Codeforces

4、打表找规律,一般没什么规律可循即可打表找规律,一般和数论有关的很喜欢考,acm也喜欢考,属于人类智慧题。Problem - 1916D - Codeforces

5、公式推导演算,常见的分为公式的等价变形、公式的化简(这个常考,一般需要先证明某些性质,可以直接抵消,一般如果原公式处理起来很复杂时就可以考虑)。Problem - 1889B - Codeforces

6、考虑奇偶数去简化问题或者分类问题,从其中的一些运算性质入手,因为奇数偶数的加减以及%运算(这个结论很重要)的结果的奇偶性是固定的,Problem - 1898C - Codeforces

7、根据性质构造模型,看看能不能分成几个块,几个不同的集合,再选择算法去解决。Problem - 1873G - Codeforces

8、考虑从小到大处理,或者是从大到小处理,有时候先处理小的对大的不会有影响,或者反过来,这样的处理顺序是最完美的。Problem - 1904D2 - Codeforces

9、边界贪心法,一般要在问题的最边界处考虑,有时候这样做结果是最优的,或者考虑边界上的影响,假如让影响最小,就使得影响<= 固定值 。 ​​​​​​Problem - E - Codeforces and Problem - 1903C - Codeforces
Problem - A - Codeforces

这篇关于寒假思维训练计划day16 A. Did We Get Everything Covered?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/657864

相关文章

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering)

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering) Power Iteration Clustering (PIC) 是一种基于图的聚类算法,用于在大规模数据集上进行高效的社区检测。PIC 算法的核心思想是通过迭代图的幂运算来发现数据中的潜在簇。该算法适用于处理大规模图数据,特别是在社交网络分析、推荐系统和生物信息学等领域具有广泛应用。Spa

SigLIP——采用sigmoid损失的图文预训练方式

SigLIP——采用sigmoid损失的图文预训练方式 FesianXu 20240825 at Wechat Search Team 前言 CLIP中的infoNCE损失是一种对比性损失,在SigLIP这个工作中,作者提出采用非对比性的sigmoid损失,能够更高效地进行图文预训练,本文进行介绍。如有谬误请见谅并联系指出,本文遵守CC 4.0 BY-SA版权协议,转载请联系作者并注

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录 在深度学习项目中,目标检测是一项重要的任务。本文将详细介绍如何使用Detectron2进行目标检测模型的复现训练,涵盖训练数据准备、训练命令、训练日志分析、训练指标以及训练输出目录的各个文件及其作用。特别地,我们将演示在训练过程中出现中断后,如何使用 resume 功能继续训练,并将我们复现的模型与Model Zoo中的

DAY16:什么是慢查询,导致的原因,优化方法 | undo log、redo log、binlog的用处 | MySQL有哪些锁

目录 什么是慢查询,导致的原因,优化方法 undo log、redo log、binlog的用处  MySQL有哪些锁   什么是慢查询,导致的原因,优化方法 数据库查询的执行时间超过指定的超时时间时,就被称为慢查询。 导致的原因: 查询语句比较复杂:查询涉及多个表,包含复杂的连接和子查询,可能导致执行时间较长。查询数据量大:当查询的数据量庞大时,即使查询本身并不复杂,也可能导致

10 Source-Get-Post-JsonP 网络请求

划重点 使用vue-resource.js库 进行网络请求操作POST : this.$http.post ( … )GET : this.$http.get ( … ) 小鸡炖蘑菇 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-w

《计算机视觉工程师养成计划》 ·数字图像处理·数字图像处理特征·概述~

1 定义         从哲学角度看:特征是从事物当中抽象出来用于区别其他类别事物的属性集合,图像特征则是从图像中抽取出来用于区别其他类别图像的属性集合。         从获取方式看:图像特征是通过对图像进行测量或借助算法计算得到的一组表达特性集合的向量。 2 认识         有些特征是视觉直观感受到的自然特征,例如亮度、边缘轮廓、纹理、色彩等。         有些特征需要通

多云架构下大模型训练的存储稳定性探索

一、多云架构与大模型训练的融合 (一)多云架构的优势与挑战 多云架构为大模型训练带来了诸多优势。首先,资源灵活性显著提高,不同的云平台可以提供不同类型的计算资源和存储服务,满足大模型训练在不同阶段的需求。例如,某些云平台可能在 GPU 计算资源上具有优势,而另一些则在存储成本或性能上表现出色,企业可以根据实际情况进行选择和组合。其次,扩展性得以增强,当大模型的规模不断扩大时,单一云平

API28_OKgo_get注意事项

1: implementation 'com.lzy.net:okgo:2.1.4' 2:在BaseApplication中onCreate()中初始化initOKgo() private void initOKgo() {//---------这里给出的是示例代码,告诉你可以这么传,实际使用的时候,根据需要传,不需要就不传-------------//HttpHeaders headers

Claude Enterprise推出计划

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行! 订阅:https://rengongzhineng.io/ 今天推出的Claude Enterprise计划,专为企业打造安全的