Educational Codeforces Round 170 (Rated for Div. 2) - C - 滑动窗口

news/2024/10/15 1:55:53

感觉全世界就我赛时没有想到这道题是滑动窗口
言归正传,这道题有两个限制条件:1.窗口大小不超过k;2.相邻元素之差为1。
对于第一点通过限制双端队列的size就行,对于第二点,我是先把数组排序,之后进行统计出现次数,并用结构体存储,然后滑动窗口解决问题,如果 新插入元素 - 1 != 前一个元素,那么就清空队列,然后插入新的元素。
接下来放代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;struct st{ll num1, num2;
};
void slove()
{ll n, k, tool = 1;cin >> n >> k;ll a[n + 10];st b[n + 10];for(ll i = 1; i <= n; i ++){cin >> a[i];}sort(a + 1, a + 1 + n);ll num = 1;for(ll i = 1; i < n; i ++){if(a[i] == a[i + 1])tool ++;else{b[num].num2 = a[i];b[num ++].num1 = tool;tool = 1;}}b[num].num1 = tool;b[num].num2 = a[n];deque <st> q;q.push_back(b[1]);ll ans = b[1].num1;tool = b[1].num1;for(ll i = 2; i <= num; i ++){if(b[i].num2 - 1 == q.back().num2){q.push_back(b[i]);tool += b[i].num1;if(q.size() > k){tool -= q.front().num1;q.pop_front();}ans = max(ans, tool);}else{ans = max(ans, tool);tool = b[i].num1;ans = max(ans, tool);while(!q.empty()){q.pop_back();}q.push_back(b[i]);}}cout << ans << endl;return ;
}
int main()
{ll t = 1;cin >> t;while(t --){slove();}return 0;
}

这道题我赛事的思路是dp,滑动窗口是赛后听群友说才恍然大悟,明明知道dp会T,但因为不想写自己想的前缀和模拟,就硬着头皮写dp了,属实有些不理智了。。。(主要是最近一直在练dp,看到这道题有点像,就很想检验成果,结果。。。)
把dp的代码也放一下把,就当作是记录了

#include<bits/stdc++.h>
#define ll long long
using namespace std;struct st{ll num1, num2;
};
void slove()
{ll n, k;cin >> n >> k;ll a[n + 10];st b[n + 10];for(ll i = 1; i <= n; i ++){cin >> a[i];}sort(a + 1, a + 1 + n);ll tool = 1;ll num = 1;for(ll i = 1; i < n; i ++){if(a[i] == a[i + 1])tool ++;else{b[num].num2 = a[i];b[num ++].num1 = tool;tool = 1;}}b[num].num1 = tool;b[num].num2 = a[n];ll dp[num + 10];memset(dp, 0, sizeof(dp));ll ans = 0;for(ll i = 1; i <= num; i ++){dp[i] = b[i].num1;ans = max(ans, dp[i]);}for(ll i = 2; i <= k; i ++){for(ll l = num; l >= i; l --){if(b[l].num2 - 1 == b[l - 1].num2 && dp[l - 1] != 0)dp[l] = max(dp[l - 1] + b[l].num1, dp[l]);ans = max(ans, dp[l]);}}cout << ans << endl;return ;
}
int main()
{ll t = 1;cin >> t;while(t --){slove();}return 0;
}

这周打算继续刷dp,去看看区间dp,加油吧。

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

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

相关文章

STM32单片机做智能宠物狗项目

目录STM32单片机做智能宠物狗材料外壳模型 STM32单片机做智能宠物狗在短视频里面看到有人用单片机做了一个宠物,让我兴趣浓厚做一个出来,我想在这里记录一下我学STM32的单片机做智能宠物的学习过程。材料 外壳模型、5个舵机(4条腿+1条尾巴)、OLED显示屏、电池、充放电模块、语…

【续】《英雄无敌》3完整版complete(英文)——免CD修改(完美版)

在前一篇文章中,介绍了《英雄无敌》3的complete(英文)版的免CD制作,但那是一副仓促之作,破解得很粗糙,留下了很大的不足!由于《英雄无敌》3的一些过场动画,是放在光盘上,通过程序加载时,再把这些资源加载到内存的,因此,程序中对光盘信息的处理远较其它游戏复杂,而…

数据结构 - 队列

队列是先进先出数据结构,分顺序和链式队列。顺序队列容量固定,易浪费空间;链式队列无限扩容,高内存利用率。队列按功能特性分多种,如阻塞、优先、延迟、循环和双端队列,不同场景有独特效果。队列也是一种操作受限的线性数据结构,与栈很相似。01、定义 栈的操作受限表现为…

rocketmq 单机版安装及可视化

配网ping www.baidu.comnmcli connection delete eth1nmcli connection add con-name eth1 type ethernet ifname eth1nmcli connection up eth1ip route showip route del default via 192.168.88.200 dev eth0下载JDKwget https://download.oracle.com/java/17/latest/jdk-17…

空间大数据的数据变换与价值提炼

在数字化时代,空间大数据正成为推动社会经济发展的关键因素。空间大数据不仅体量巨大,而且具有高速流转、多样类型和真实性等特点,它们在获取、存储、管理、分析方面超出了传统数据库软件工具的能力范围。地理信息系统(GIS)作为处理和分析空间大数据的重要工具,其在数据变…

MySQL 建立了唯一索引的字段允许多个 NULL 值存在吗

原文:MySQL 唯一索引的字段值允许多个 NULL 值存在吗结论:MySQL innoDB 引擎,设置了唯一索引的列,不仅允许 NULL 值存在,而且允许多个 NULL 值存在。 示例:字段 userCardNum 添加了唯一索引。证实是允许存在的多个 NULL 值数据的:解释:因为 NULL 表示未知值。多个 NULL…

如何构建高效数据流通交易体系

在数字化时代,数据已成为关键生产要素,其高效流通和交易是推动数字经济发展的核心。构建一个高效、安全、合规的数据流通交易体系,对于释放数据价值、促进经济社会发展具有重要意义。 一、建立合规高效的数据要素流通和交易制度《数据二十条》提出,要建立合规高效、场内外结…

文献阅读

一:文献管理软件——小绿鲸 1:文献乱码问题 一个很容易遇到的问题是一些期刊下载的论文pdf导入小绿鲸会使得划词翻译时出现乱码于是我想着先通过wps打开,用扫描件识别这个功能再导入后,乱码问题解决