CSP-S 2023 T1密码锁 T2消消乐

T1 密码锁

对于一种状态,其可能产生的其他状态共有两种情况,一种情况是只转一个拨圈,这样产生的密码共有 5 ∗ 9 = 45 5*9=45 59=45种,另一种情况是转相邻的两个拨圈,这样产生的密码共有 4 ∗ 9 = 36 4*9=36 49=36种,所以一种状态能产生的密码共有 45 + 36 = 81 45+36=81 45+36=81种。现在题目中给出了 n ( n ≤ 8 ) n(n\leq 8) n(n8)个状态,问能满足所有这些状态的密码有多少种。
由于密码只有 5 5 5位,所以总共的情况也只有 1 0 5 10^5 105种,对于每种密码,我们只需要判断它是不是能到达给出的 n n n个状态。判断时,我们遍历 n n n个状态,对每个状态分别进行转一个拨圈的变换和转两个拨圈的变换,看是否能够得到该密码,若 n n n个状态都符合条件,则答案加一。复杂度是完全可以接受的。

再讲一种复杂度较小的做法。对于每种状态 ( n ≤ 8 ) (n\leq 8) (n8),枚举这个状态所能到达的所有密码( 81 81 81种),记录每种密码被枚举到的次数。枚举完 n n n个状态能到达的密码后,遍历所有密码,若这个密码被枚举到的次数为 n n n,也就说明每个状态都能到达这个密码,则答案加一。

#include <bits/stdc++.h>using namespace std;
int n, m[10][6], ans;
map<string, int> mp;int main(int argc, char const *argv[]) {cin >> n;for (int i = 1; i <= n; i++)for (int j = 1; j <= 5; j++)cin >> m[i][j];for (int i = 1; i <= n; i++)for (int j = 1; j <= 5; j++) {for (int k = 0; k < 10; k++) {string s = "";for (int l = 1; l < j; l++) s += char(m[i][l] + '0');if (m[i][j] == k) continue;s += char(k + '0');for (int l = j + 1; l <= 5; l++) s += char(m[i][l] + '0');mp[s]++;}if (j == 5) continue;for (int k = 1; k < 10; k++) {string s = "";for (int l = 1; l < j; l++) s += char(m[i][l] + '0');s += char((m[i][j] + k + 10) % 10 + '0');s += char((m[i][j + 1] + k + 10) % 10 + '0');for (int l = j + 2; l <= 5; l++) s += char(m[i][l] + '0');mp[s]++;}}for (auto i : mp)if (i.second == n)ans++;cout << ans << endl;
}

T2 消消乐

这个题的重点在于如何判断一个串是否可以被消除:用一个栈依次读串里的字符,若该字符与栈顶的元素相同,则弹出栈顶,否则把该元素放入栈,最后看栈是否为空即可,这样就得到了 n 3 n^3 n3的做法,有 35 35 35分。

// 35pts
#include <bits/stdc++.h>
#define A 100010using namespace std;
int n, top, ans; string s;
char sta[A];int main(int argc, char const *argv[]) {cin >> n >> s;for (int l = 0; l < n; l++)for (int r = l + 1; r < n; r++) {top = 0;for (int i = l; i <= r; i++) {if (sta[top] == s[i]) top--;else sta[++top] = s[i];}if (top == 0) ans++;}cout << ans << endl;
}

在上面的做法中,对于相同的左端点,我们枚举了所有的右端点,重复判断了许多次,其实只要从左端点开始走一遍到末尾就可以,每走一步都判断一下栈是否为空。复杂度降为 n 2 n^2 n2,有 50 50 50分。

// 50pts
#include <bits/stdc++.h>
#define A 200010using namespace std;
int n, top, ans; string s;
char sta[A];int main(int argc, char const *argv[]) {cin >> n >> s;for (int l = 0; l < n; l++) {top = 0;for (int r = l; r < n; r++) {if (sta[top] == s[r]) top--;else sta[++top] = s[r];if (top == 0) ans++;}}cout << ans << endl;
}

再看下一个部分分,“字符串中的每个字符独立等概率地从字符集中选择”,也就是说我们确定了左端点之后,在右端点不断增大的过程中,这个串会越来越长,能产生消除串的概率会越来越低,所以给右端点定一个界限,我们认为在这个界限之后就不可能产生消除串。这个界限根据左端点的个数来定,该部分分的数据范围下 n ≤ 2 ∗ 1 0 5 n\leq2*10^5 n2105,那就卡着能跑过的数据范围,把右端点的界限设置到 1000 1000 1000 2 ∗ 1 0 8 2 ∗ 1 0 5 \frac{2*10^8}{2*10^5} 21052108=1000),这样能拿到 60 60 60分。

// 60pts
#include <bits/stdc++.h>
#define A 200010using namespace std;
int n, top, ans; string s;
char sta[A];int main(int argc, char const *argv[]) {cin >> n >> s;for (int l = 0; l < n; l++) {top = 0;int cnt = 1000;for (int r = l; r < n; r++) {if (sta[top] == s[r]) top--;else sta[++top] = s[r];if (top == 0) ans++;if (--cnt < 0 and n > 8000) break;}}cout << ans << endl;
}

其实能产生一个子串的条件是,这两个栈的状态是相同的。例如样例“accabccb”,初始时为空栈,代表的位置为 0 0 0;“acca”为空栈,代表的位置为 3 3 3;“accabccb”为空栈,代表的位置为 7 7 7;这三个位置中每两个位置的组合都可以产生一个串,也就是 C 3 2 C^2_3 C32,共可以产生 3 3 3个串。所以我们统计每种栈的状态出现的次数 n n n,答案累计上 C n 2 = n ( n − 1 ) 2 C^2_n=\frac{n(n-1)}{2} Cn2=2n(n1)即可。这样可以拿到 90 90 90分,会有两个点 M L E MLE MLE,就是刚才 50 − 60 50-60 5060分的两个点,原因是栈的状态太多,可能会产生大约 n n n个字符串,串的长度从 1 1 1递增到 n n n m a p map map占的空间太大。

// 90pts
#include <bits/stdc++.h>
#define A 2000010using namespace std;
typedef long long ll;
int n, top;
string s, now;
char sta[A];
ll ans;
map<string, int> mp;int main(int argc, char const *argv[]) {cin >> n >> s;mp[""]++;for (int i = 0; i < n; i++) {if (sta[top] == s[i]) top--, now.pop_back();else sta[++top] = s[i], now += s[i];mp[now]++;}for (auto i : mp)ans += 1ll * (i.second * 1ll * (i.second - 1ll) / 2);cout << ans << endl;
}

到这里可以想到把上面两个代码合一下就可以满分,所以现在问题来到了如何特判 11 、 12 11、12 1112这两个点。这两个点的条件上面也分析过了,“字符串中的每个字符独立等概率地从字符集中选择”, a − z a-z az 26 26 26个字母出现的概率是相同的,那我们就在输入字符串之后统计一下每个字母出现的次数,如果该字母出现的次数与期望次数的差值过大,那么我们认为这个点不是第 11 11 11个点或第 12 12 12个点。

// 100pts
#include <bits/stdc++.h>
#define A 2000010using namespace std;
typedef long long ll;
int n, top, t[27];
string s, now;
char sta[A];
ll ans;
bool flag;
map<string, int> mp;int main(int argc, char const *argv[]) {cin >> n >> s;for (int i = 0; i < n; i++) t[s[i] - 'a']++;for (int i = 0; i < 26; i++) // 判断测试点if (abs(t[i] - n / 26) > 10000) {flag = 1;break;}if (flag) {mp[""]++;for (int i = 0; i < n; i++) {if (sta[top] == s[i]) top--, now.pop_back();else sta[++top] = s[i], now += s[i];mp[now]++;}for (auto i : mp)ans += 1ll * (i.second * 1ll * (i.second - 1ll) / 2);cout << ans << endl;}else {for (int l = 0; l < n; l++) {top = 0;int cnt = 1000;for (int r = l; r < n; r++) {if (sta[top] == s[r]) top--;else sta[++top] = s[r];if (top == 0) ans++;if (--cnt < 0 and n > 8000) break;}}cout << ans << endl;}
}

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

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

相关文章

传奇引擎启动后没有正常运行如何解决

GOM引擎启动后M2空白进不去游戏 当我们版本架设好之后发现怎么都进不去游戏&#xff0c;登陆器也重新生成了还是进不去。这个错误是因为版本中的一些插件错误造成的&#xff0c;那么我们就找到插件的文件&#xff1a;D:\MirServer\Mir200 PlugList.txt打开后可以看到里面有.DL…

Collectors.toMap报错:空指针 key重复

Java 8中的stream在项目开发中被同学们用的风生水起&#xff0c;当然大家也踩了不少坑。下面我就来说说Collections.toMap在项目使用中踩的坑&#xff0c;避免大家重复被坑。 一.介绍Collectors.toMap Collectors.toMap 是 Java 8 中的一个收集器&#xff0c;它可以将流中的元…

C# OpenCvSharp DNN 部署L2CS-Net人脸朝向估计

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Windows.Forms;namespace OpenCvSharp_DNN_Demo …

hadoop hdfs的API调用,在mall商城代码中添加api的调用

在网上下载了现成的商城代码的源码 本次旨在熟悉hdfs的api调用&#xff0c;不关注前后端代码的编写&#xff0c;所以直接下载现成的代码&#xff0c;代码下载地址。我下载的是前后端在一起的代码&#xff0c;这样测试起来方便 GitHub - newbee-ltd/newbee-mall: &#x1f525; …

Seata入门系列【18】Seata集成Mybatis-Plus多数据源

1 前言 在使用单个服务&#xff0c;多数据源时&#xff0c;也存在分布式事务问题。 当单体系统需要访问多个数据库&#xff08;实例&#xff09;时就会产生分布式事务。 比如&#xff1a;用户信 息和订单信息分别在两个MySQL实例存储&#xff0c;用户管理系统删除用户信息&am…

驱动开发11-2 编写SPI驱动程序-点亮数码管

驱动程序 #include <linux/init.h> #include <linux/module.h> #include <linux/spi/spi.h>int m74hc595_probe(struct spi_device *spi) {printk("%s:%d\n",__FILE__,__LINE__);char buf[]{0XF,0X6D};spi_write(spi,buf,sizeof(buf));return 0; …

【SpringMVC篇】5种类型参数传递json数据传参

&#x1f38a;专栏【SpringMVC】 &#x1f354;喜欢的诗句&#xff1a;天行健&#xff0c;君子以自强不息。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f33a;普通参数&#x1f33a;POJO参数&#x1f33a;嵌套…

2024年申报国自然项目基金撰写及技巧:基本要求和标准、项目撰写的方法和技巧、申请流程

随着社会经济发展和科技进步&#xff0c;基金项目对创新性的要求越来越高。申请人需要提出独特且有前瞻性的研究问题&#xff0c;具备突破性的科学思路和方法。因此&#xff0c;基金项目申请往往需要进行跨学科的技术融合。申请人需要与不同领域结合&#xff0c;形成多学科交叉…

Spring Boot 解决跨域问题的 5种方案

跨域问题本质是浏览器的一种保护机制&#xff0c;它的初衷是为了保证用户的安全&#xff0c;防止恶意网站窃取数据。 一、跨域三种情况 在请求时&#xff0c;如果出现了以下情况中的任意一种&#xff0c;那么它就是跨域请求&#xff1a; 协议不同&#xff0c;如 http 和 https…

nacos 常见问题整理包含容器环境

文章目录 0. nacos客户端日志文件位置最常见的问题1. 容器环境端口开放不够导致的问题原理解析 2.服务端启用了鉴权客户端常见错误信息如下服务端报错信息如下 其他一些问题0. nacos高版本服务端是否支持旧的客户端&#xff1f;1. Error code:503,msg:server is DOWN now, plea…

【UE5】如何在UE5.1中创建级联粒子系统

1. 可以先新建一个actor蓝图&#xff0c;然后在该蓝图中添加一个“Cascade Particle System Component” 2. 在右侧的细节面板中&#xff0c;点击“模板”一项中的下拉框&#xff0c;然后点击“Cascade粒子系统&#xff08;旧版&#xff09;” 然后就可以选择在哪个路径下创建级…

前端Vue框架系列—— 学习笔记总结Day04

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

Java NIO为何导致堆外内存OOM了?

Java NIO为何导致堆外内存OOM了&#xff1f; 描述 某天报警&#xff1a;某台机器部署的一个服务突然无法访问。谨记第一反应登录机器查看日志&#xff0c;因为服务挂掉&#xff0c;很可能因OOM。这个时候在机器的日志中发现了如下的一些信息&#xff1a; nio handle failed j…

C++对象和类

类的基础 1.cpp中对象默认访问权限都是private的 2.私有成员只能通过公有函数访问使用 3.类方法名称需包含类名&#xff0c;为函数的限定名 在头文件中定义类&#xff0c;同时将公有方法原型声明(类似Java接口道理). #ifndef STOCK00_H_ #define STOCK00_H_ #include<s…

Leetcode—485.最大连续1的个数【中等】明天修改

2023每日刷题&#xff08;十五&#xff09; Leetcode—2.两数相加 迭代法实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l…

Python使用got库如何写一个爬虫代码?

got库是一个Python的HTTP库&#xff0c;可以用于爬取网页数据。它提供了简单易用的API&#xff0c;支持异步请求和爬虫IP设置等功能。使用got库进行爬虫开发&#xff0c;可以快速地获取所需数据。下面是使用got库进行爬虫的基本步骤&#xff1a; 1、安装got库&#xff1a;可以使…

LeetCode454. 4Sum II

文章目录 一、题目二、题解 一、题目 Given four integer arrays nums1, nums2, nums3, and nums4 all of length n, return the number of tuples (i, j, k, l) such that: 0 < i, j, k, l < n nums1[i] nums2[j] nums3[k] nums4[l] 0 Example 1: Input: nums1 …

sort函数用法

1、基本数据类型数组的排序 若比较函数不填&#xff0c;默认升序排序。 #include <stdio.h> #include <algorithm> using namespace std; int main() { int a[5] {3,5,2,1,4}; sort(a,a5); for(int i0;i<5;i) { printf("%d",a[i]); } r…

PTA 秀恩爱分得快(树)

题目 古人云&#xff1a;秀恩爱&#xff0c;分得快。 互联网上每天都有大量人发布大量照片&#xff0c;我们通过分析这些照片&#xff0c;可以分析人与人之间的亲密度。如果一张照片上出现了 K 个人&#xff0c;这些人两两间的亲密度就被定义为 1/K。任意两个人如果同时出现在…

ruoyi框架前端修改message消失时间

修改教程 打开modal.js文件&#xff0c;找到Message.success&#xff0c;然后把参数设置进去就行。单位是10001秒。 // 可以设置的参数如下export interface ElMessageOptions {/** Message text */message: string | VNode/** Message type */type?: MessageType/** Custom …