寒假思维训练计划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

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

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

相关文章

生产解决方案:实现上传图片至主机文件夹下

1 需求&#xff1a; 目前需要实现&#xff0c;上传图片时候&#xff0c;自动根据图片上传地址&#xff0c;创建对应文件夹&#xff0c;例如&#xff1a;上传文件地址为&#xff0c;/2024/1/29/楼层1/1713.jpg&#xff0c;则存储结构应如下图所示。

[杂项:AD画板]B站_01

一、PCBA 1、快捷方式 CTRL鼠标滚轮&#xff1a;缩放界面 鼠标右键&#xff1a;拖拽界面 SHIFT鼠标滚轮&#xff1a;左右移动界面 CAPSLK鼠标滚轮&#xff1a;上下移动界面 CTRL鼠标左键&#xff1a;高亮选中接线网络 【】&#xff1a;调节高亮亮度&#xff0c;需要处于…

Sqli靶场 11--->22Less

打靶场&#xff0c;打靶场&#xff0c;打靶场&#xff0c;打靶场......靶场你别打我 球球 11.不用密码&#xff08;狂喜) 这一关知不知道账号密码都无所谓 那么我们就尝试一下报错类型&#xff0c;单引号报错&#xff0c;好&#xff0c;字符型 构造poc I_don_t_know_t…

C++ 之LeetCode刷题记录(二十二)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 目标&#xff1a;执行用时击败90%以上使用 C 的用户。 112. 路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该…

[PHP]严格类型

PHP: 类型声明 - Manual

数字身份保护:Web3如何改变个人隐私观念​

随着Web3时代的来临&#xff0c;数字身份保护成为人们关注的焦点之一。Web3技术的引入不仅为个人隐私带来了新的挑战&#xff0c;同时也为我们重新思考和改变个人隐私观念提供了契机。本文将深入探讨Web3如何改变个人隐私观念&#xff0c;以及在数字身份保护方面的创新举措。 1…

计算机网络-H3C设备型号简介

H3C(新华三)的设备主要有&#xff1a;交换机、路由器、防火墙、无线AC、无线AP等组成。基本所有H3C设备都采用同一版本&#xff0c;基本命令都差不多&#xff0c;有V5、V7系列。 一、交换机系列 交换机有傻瓜式二层交换机&#xff0c;三层交换机&#xff0c;高端框式交换机。 交…

MATLAB环境下基于信号处理的EEG信号的睡眠纺锤波和K-复合波检测

睡眠纺锤波是正常人浅 - 中度睡眠脑电图的一种表现&#xff0c;随着睡眠深浅的变化而改变。睡眠纺锤波可以作为检测中枢神经机能正常与否的一个指标&#xff0c;对评估大脑发育与脑功能有重要意义。睡眠纺锤波在丘脑的后外侧腹侧核形成&#xff0c;通过投射系统投射到大脑皮层&…

CH395Q之CH395Q简介(一)

本节主要介绍以下内容&#xff1a; 1、TCP/IP协议栈是什么&#xff08;了解&#xff09; 2、CH395Q是什么&#xff08;了解&#xff09; 3、CH395Q工作命令&#xff08;熟悉&#xff09; 4、CH395Q & W5500 一、TCP/IP协议栈是什么 是一系列网络协议的总和&#xff0…

uni-app 微信小程序CI机器人自动化部署方案

uniApp微信小程序CI机器人自动化部署 1. 微信公众平台上&#xff0c;在开发设置里面小程序代码&#xff0c;将上传代码的服务IP地址填充下&#xff0c;生成一个上传秘钥下载下来 2. 将下载的秘钥文件放在uni-cli 项目的根目录下 3. npm 微信官方的miniprogram-ci模块 const c…

蓝桥杯省赛无忧 课件50 记忆化搜索

01 斐波那契数列 02 混境之地5 03 地宫取宝

Android开发学习-中级控件

Drawable Android把所有能够显示的图形都抽象为Drawable类(可绘制的)。 这里的图形不止是图片&#xff0c;还包括色块、画板、背景等。 包含图片在内的图形文件放在res目录的各个drawable目录下&#xff0c;其中drawable目录一般保存描述性的XML文件&#xff0c;而图片文件一…

Qlik Sense : IntervalMatch(离散匹配)

什么是IntervalMatch IntervalMatch 前缀用于创建表格以便将离散数值与一个或多个数值间隔进行匹配&#xff0c;并且任选匹配一个或多个额外关键值。 语法&#xff1a; IntervalMatch (matchfield)(loadstatement | selectstatement ) IntervalMatch (matchfield,keyfield…

问卷与量表的区别,以及量表的信效度分析应该如何测量

最近在各个平台总能收到这样一个问题 “问卷如何进行信效度分析&#xff1f;”每次小编提到信效度分析时都会特意强调&#xff0c;只有量表才需要进行信度与效度分析&#xff0c;普通问卷&#xff08;单选、多选、填空等&#xff09;并不需要。那么今天就再深入探讨一下问卷与量…

如何选择便捷安全的黄金交易平台?

黄金交易平台的介绍 黄金交易平台是一个提供方便、安全的方式进行黄金交易的网上平台。 投资者可以通过这些平台进行黄金的买卖&#xff0c;参与黄金市场的投资活动。 这些平台提供了一个简单易用的界面&#xff0c;让投资者可以方便地进行交易操作。 选择合适的黄金交易平台…

数字图像处理(实践篇)三十四 OpenCV-Python绘制椭圆

目录 一 涉及的函数 二 实践 一 涉及的函数 cv2.ellipse(img,center,axes,angle,start_angle,end_angle,color,thickness) 参数: ①<

【计网·湖科大·思科】实验五 IPV4地址-分类地址和构建超网

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

Markdown(2篇文章学会Markdown第二篇

目录 1. 图片1.1 行内形式图片&#xff1a;\!\[Alt text]\(/path/to/img.jpg "Optional title")1.2 参考形式图片&#xff1a;\!\[内容]\[1] \[1]: image_url "alt 提示" 2. 列表2.1 无序列表&#xff1a;*、或-2.2 有序列表&#xff1a;数字接着一个英文…

2024年【N1叉车司机】考试内容及N1叉车司机复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 N1叉车司机考试内容是安全生产模拟考试一点通生成的&#xff0c;N1叉车司机证模拟考试题库是根据N1叉车司机最新版教材汇编出N1叉车司机仿真模拟考试。2024年【N1叉车司机】考试内容及N1叉车司机复审考试 1、【多选题…