首页 > 其他分享 >[CSP-S 2023] 密码锁

[CSP-S 2023] 密码锁

时间:2023-12-23 16:13:29浏览次数:42  
标签:状态 锁车 转动 密码 拨圈 2023 密码锁 CSP

题目描述

小 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;
}

标签:状态,锁车,转动,密码,拨圈,2023,密码锁,CSP
From: https://www.cnblogs.com/sdfzls/p/17923193.html

相关文章

  • 2023.12.23模拟赛总结
    前言:这次比赛又是tm的AB组一起打,tm的题目怎么一点质量都没有啊,三道简单题+一道模板题,而且模板我还没做过,而且我的一个部分换成那个模板就A了这次300pts,rank3,感觉不太好T1dp,\(f[i][0/1]\)表示i位置填0/1的方案数,直接转移,写高精度T2感觉应该放T4,实际最难首先,我们设跳楼机从0开......
  • 2023-2024-1 20231303 《计算机基础与程序设计》赵泊瑄第十三周学习总结
    2023-2024-120231303《计算机基础与程序设计》赵泊瑄第十三周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里作业要求的链接https://i.cnblogs.com/posts/edit)这个作业的目标总结第十三周学习收获作业正文2023-......
  • 2023-2024-1 20231419 《计算机基础与程序设计》第十三周学习总结
    2023-2024-120231419《计算机基础与程序设计》第十三周学习总结作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK13这个作业的目标自学《C语言程序设......
  • #9 2023.12.18
    怎么做题速度单调递减了。464.THUPC2024Pre省流:我是演员。M我过的题。K我过的题。暴力打表就行了,我在本地打了三分钟就出答案了!很快。J我过的题。考虑\(v\)什么时候对\(len=k\)没有贡献。那就是\(v\)把序列分成了若干区间\([l,r]\),\(ban\)掉的区间就是\([......
  • keepass口令管理实践(选做)20231405
    keepass口令管理实践(选做)任务详情个人隐私泄露,信息安全是一个大问题,参考https://post.smzdm.com/p/713042/,https://post.smzdm.com/p/713042/学习使用keepass保护自己的口令,提交实践截图。作业内容1.下载keepass官方版和中文的语言包2.将中文语言包存放在KeePassPasswordS......
  • 2023-2024-1 20231403 《计算机基础与程序设计》第十三周学习总结
    作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作业要求在哪里2023-2024-1计算机基础与程序设计第十三周作业)这个作业的目标自学教材《C语言程序设计》第12章并完成云班课测试作业正文https://www.cnblogs.com/lsrmy/p/179......
  • 2023-2024-1 20231417 《计算机基础与程序设计》第十三周学习总结
    2023-2024-120231417《计算机基础与程序设计》第十三周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十三周作业这个作业的目标自学教材《C语言程序设计》第12章并完成云班课测试......
  • 2023-2024-1 20231402《计算机基础与程序设计》第十三周学习总结
    2023-2024-120231402《计算机基础与程序设计》第十三周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十三周作业这个作业的目标自学《C语言程序设计》第12章作业正文https://w......
  • 2023-2024-1 20231424《计算机基础与程序设计》第13周学习总结
    2023-2024-120231424《计算机基础与程序设计》第13周学习总结作业信息作业属于的课程<班级链接>(2022-2023-1-计算机基础与程序设计)作业要求<作业要求>(2022-2023-1计算机基础与程序设计第一周作业)作业目标《C语言程序设计》第12章作业正文https://www.cnblo......
  • 雅礼 2023.12.20 习题课记录(讲解版)
    雅礼\(2023.12.20\)习题课记录(讲解版)前言AlwaysCF,NeverAT。又双是CF题,只能说“水”,AK了。水题(只放代码)B-TwoVessels(CF1872A)有分别装有\(a,b\)单位水的两个杯子,容量无限大。现在有一个勺子,容量为\(c\),每次可以从一个杯子里舀一勺不超过\(c\)单位的水(\(c\)......