[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 ...
随机推荐
- 原来你是这样的SpringBoot--Async异步任务
本节我们一起学习一下SpringBoot中的异步调用,主要用于优化耗时较长的操作,提高系统性能和吞吐量. 一.新建项目,启动异步调用 首先给启动类增加注解@EnableAsync,支持异步调用 @En ...
- 2019-A
#include <iostream> #include <vector> using namespace std; class Mystack{ private: int t ...
- 微服务使用openfeign调用单点的会话失效问题
项目Springcloud,认证中心方式实现SSO使用开源框架Sa-Token 本身的单独访问每个客户端服务的单点就没有问题.然后单点通过Fegin调用就不好使了! 主要使用的Sa-Token的微服务 ...
- Sunshine on my shoulders
https://music.163.com/#/song?id=1477706 Sunshine on my shoulders makes me happy照在我肩上的阳光让我欢乐Sunshine ...
- Keycloak 创建和修改自定义用户信息
前言 公司在用 Keycloak 作为认证服务器,之前在系统数据库里存的,后来想了想是不是可以在 Keycloak 中存.在网上找的方法大多都是通过 admin 接口去改,但这种方法就需要两种解决方案 ...
- JDK对于Java的作用
JDK是Java Development Kit的缩写,是Java的开发工具包(SDK).JDK 是整个 Java 的核心,包括 Java 运行环境(Java Runtime Envirnment,简 ...
- C++ STL标准容器的特点和典型的使用场景
概念和作用 C++标准模板库(Standard Template Library,STL)提供了一组通用的模板类和函数,用于处理常见的数据结构和算法.STL中的标准容器是其中的重要组成部分,它们提供了 ...
- jenkins实践篇(1)——基于分支的自动发布
问题背景 想起初来公司时,我们还是在发布机上直接执行发布脚本来运行和部署服务,并且正式环境和测试环境的脚本都在一起,直接手动操作脚本时存在比较大的风险就是将环境部署错误,并且当时脚本部署逻辑还没有检测 ...
- 安装了less后仍然报错:Error: Cannot find module 'less'
结果是命令有点问题,正常来说是用下面的: npm i less –save-dev-g 然后可以正常启动了: --------------------------------------------- ...
- Unity - UIWidgets 2. 控件组合
UIWidgets没有提供完整文档, 称可以去看Flutter的文档 中文 \ 英文 控件(Control)在Flutter中称为"Widget", 一个界面的若干控件是通过wid ...