[CSP-S 2023] 密码锁
题目描述
小 Y 有一把五个拨圈的密码锁。如图所示,每个拨圈上是从 \(0\) 到 \(9\) 的数字。每个拨圈都是从 \(0\) 到 \(9\) 的循环,即 \(9\) 拨动一个位置后可以变成 \(0\) 或 \(8\),
因为校园里比较安全,小 Y 采用的锁车方式是:从正确密码开始,随机转动密码锁仅一次;每次都是以某个幅度仅转动一个拨圈或者同时转动两个相邻的拨圈。
当小 Y 选择同时转动两个相邻拨圈时,两个拨圈转动的幅度相同,即小 Y 可以将密码锁从 \(\tt{0\;0\;1\;1\;5}\) 转成 \(\tt{1\;1\;1\;1\;5}\),但不会转成 \(\tt{1\;2\;1\;1\;5}\)。
时间久了,小 Y 也担心这么锁车的安全性,所以小 Y 记下了自己锁车后密码锁的 \(n\) 个状态,注意这 \(n\) 个状态都不是正确密码。
为了检验这么锁车的安全性,小 Y 有多少种可能的正确密码,使得每个正确密码都能够按照他所采用的锁车方式产生锁车后密码锁的全部 \(n\) 个状态。
输入格式
输入的第一行包含一个正整数 \(n\),表示锁车后密码锁的状态数。
接下来 \(n\) 行每行包含五个整数,表示一个密码锁的状态。
输出格式
输出一行包含一个整数,表示密码锁的这 \(n\) 个状态按照给定的锁车方式能对应多少种正确密码。
样例 #1
样例输入 #1
1
0 0 1 1 5
样例输出 #1
81
提示
【样例 1 解释】
一共有 \(81\) 种可能的方案。
其中转动一个拨圈的方案有 \(45\) 种,转动两个拨圈的方案有 \(36\) 种。
【数据范围】
对于所有测试数据有:\(1 \leq n \leq 8\)。
测试点 | \(n\leq\) | 特殊性质 |
---|---|---|
\(1\sim 3\) | \(1\) | 无 |
\(4\sim 5\) | \(2\) | 无 |
\(6\sim 8\) | \(8\) | A |
\(9\sim 10\) | \(8\) | 无 |
特殊性质 A:保证所有正确密码都可以通过仅转动一个拨圈得到测试数据给出的 \(n\) 个状态。
题解
刚开始看到这个题,橙题,我应该能做,发现如果n等于1的时候,答案肯定是81,但是当n比较大的时候,不知道该怎么做了?一直在想,他有什么样的性质才能这样?
但是,我一直有个感觉,这个题可以搜索,为什么呢?因为最多有5位密码,后来换了思路,我们搜索得到所有可能的状态,依次判断这种状态是否能通过拨圈达到题目中说的状态,这样的时间复杂度是O(100000),判断的时间复杂度为5n,所以最终的时间复杂是O(500000n)。
枚举的代码非常好写,但是判断的代码不好写,譬如。5 9会变成6 0,7 1,8 2,9 3,0 4,1 5,2 6,3 7,4 8共9种状态,我们发现他们的差是一样的,但是有个问题,9会变0,这个怎么处理?我最终的处理方法是判断两者之间的大小关系,如果发生变化,把小的数字加上10,从而保持原来的大小关系,代码如下:
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int n,a[15][15],ans;
int c[10];
bool check(){
for(int i=1;i<=n;i++){
bool b=true;//是否转动过拨圈
int f;
for(int j=1;j<=5;j++){
if(c[j]==a[i][j]) continue;
else{
if(b==false)
return false;
if(c[j+1]!=a[i][j+1]&&j<=4){
if(c[j]<c[j+1]){
f=a[i][j+1];
if(a[i][j+1]<a[i][j]) f=a[i][j+1]+10;
if(f-a[i][j]!=c[j+1]-c[j]) return false;
j++;
b=false;
continue;
}
if(c[j+1]==c[j]){
if(a[i][j+1]!=a[i][j]) return false;
j++;
b=false;
continue;
}
if(c[j+1]<c[j]){
f=a[i][j];
if(a[i][j]<a[i][j+1]) f=a[i][j]+10;
if(f-a[i][j+1]!=c[j]-c[j+1]) return false;
j++;
b=false;
continue;
}
}
if((c[j+1]==a[i][j+1]&&j<=4)||j==5){
b=false;//已经转动过一次拨圈
}
}
}
if(b==true) return false;
}
return true;
}
void dfs(int k){
if(k==6){
if(check()) {
ans++;
//for(int i=1;i<=5;i++) cout<<c[i]<<" ";
//cout<<endl;
}
return;
}
for(int i=0;i<=9;i++){
c[k]=i;
dfs(k+1);
c[k]=0;
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=5;j++){
scanf("%d",&a[i][j]);
}
}
dfs(1);
cout<<ans<<endl;
return 0;
}
[CSP-S 2023] 密码锁的更多相关文章
- 【Voyage】GDOI 2023 旅游记 || ECHO.
\(\color{#FFFFFF}{那是什么样的旅途呢}\) \(\color{#FFFFFF}{真的会害怕很多东西呢.想想害怕的其实不止这样一件事,便产生了"其实都一样没关系的,都应该踏过 ...
- CSP的今世与未来
一.从两个工具说起 最近Google又推出了两款有关CSP利用的小工具,其一为CSP Evaluator,这是一个能够评估你当前输入的CSP能否帮助你有效避免XSS攻击的工具,其用法非常简单,在输入框 ...
- windows2003安装证书服务:csp配置不正确、您没有此密钥容器的写访问权限
1.填写CA名称后在生成密钥时提示:csp配置不正确或安装不完整. 原因:可能的原因为CS服务(Crysptographic Service)没有启动 . ps:该服务依赖RPC服务,但RP ...
- CSP -- 运营商内容劫持(广告)的终结者
缘由 我们公司最近手机端H5 经常受到商户和用户的投诉,说有广告并且导致不能正常进行操作,我们商户自己当然不会加广告了,但是商户和用户可不管这些了,就认为是我们的问题 探索发现根本 目前我们用的很多浏 ...
- 前端安全配置之Content-Security-Policy(csp)
什么是CSP CSP全称Content Security Policy ,可以直接翻译为内容安全策略,说白了,就是为了页面内容安全而制定的一系列防护策略. 通过CSP所约束的的规责指定可信的内容来源( ...
- openjudge8469特殊密码锁[贪心]
描述 有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态. 然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转.当然,如果你 ...
- NOI OpenJudge 8469 特殊密码锁 Label贪心
描述 有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态. 然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转.当然,如果你 ...
- http://www.oreilly.com/catalog/errataunconfirmed.csp?isbn=9780596529321
集体智慧勘误表: http://www.oreilly.com/catalog/errataunconfirmed.csp?isbn=9780596529321 ------------------- ...
- 采用 PAT工具及CSP语言,对一个问题进行自动机 建模
pat是新加坡国立开发的工具,需要的去官网下http://www.comp.nus.edu.sg/~pat/ ,学了一天,是个不错的自动机验证工具,感觉还不错啊. 验证一个数是否为斐波那契数且为质数 ...
- Android 九宫格密码锁进入程序
设置九宫格密码锁进入程序,设置,重置,取消等,安卓巴士地址http://www.apkbus.com/forum.php?mod=viewthread&tid=182620&extra ...
随机推荐
- .NET开源最全的第三方登录整合库 - CollectiveOAuth
前言 我相信很多同学都对接过各种各样的第三方平台的登录授权获取用户信息(如:微信登录.支付宝登录.GitHub登录等等).今天给大家推荐一个.NET开源最全的第三方登录整合库:CollectiveOA ...
- Blazor前后端框架Known-V1.2.15
V1.2.15 更新日期 2023-09-17 更新内容 修复角色不启用相关问题 RadioList组件支持平原(Plain)模式 CheckList组件支持平原(Plain)模式 DataGrid组 ...
- MySQL 表分区使用实践
在使用 MySQL 8.0 表分区时,需要注意以下一些关键事项和最佳实践: 支持的存储引擎: MySQL 8.0 表分区仅支持一些特定的存储引擎,如 InnoDB 和 NDB(NDB 是 MySQL ...
- dedebiz友情链接样式修改
文件位置 /system/taglib/flink.lib.php 45行位置 根据自己需求修改就行
- MySQL系列之MHA高可用——主从复制架构演变介绍、高可用MHA、管理员在高可用架构维护的职责
文章目录 1. 主从复制架构演变介绍 1.1 基本结构 1.2 高级应用架构演变 1.2.1 高性能架构 1.2.2 高可用架构 2. 高可用MHA ***** 2.1 架构工作原理 2.2 架构介绍 ...
- 文心一言 VS 讯飞星火 VS chatgpt (110)-- 算法导论10.2 1题
一.用go语言,单链表上的动态集合操作 INSERT 能否在 O(1)时间内实现?DELETE 操作呢? 文心一言: 在单链表中,INSERT 和 DELETE 操作的时间复杂度通常是 O(n),其中 ...
- 企业FTP搭建教程
安装Vsftpd 提前关闭selinux 和firewalld防火墙 安装vsftp软件包: yum install -y vsftpd* 启动vsftp服务器: systemctl start vs ...
- Python 继承和子类示例:从 Person 到 Student 的演示
继承允许我们定义一个类,该类继承另一个类的所有方法和属性.父类是被继承的类,也叫做基类.子类是从另一个类继承的类,也叫做派生类. 创建一个父类 任何类都可以成为父类,因此语法与创建任何其他类相同: 示 ...
- react 16.3生命周期更新解析
React v16.3虽然是一个小版本升级,但是却对React组件生命周期函数有巨大变化. 文章梗概 新版本+2-3个生命周期. 为什么增加那2个生命周期? 为什么减去之前3个生命周期? 相关知识延伸 ...
- 【pwn】ciscn_2019_s_3 -- rop,gadget利用,泄露栈地址
这道题挺好的,可以帮助我更好的理解gadget的利用以及rop技术 首先,查一下程序保护情况 拖进ida分析 这里sys_read和sys_write是系统调用函数,看汇编可以分析出来 我们首先要了解 ...