U389139 至少有一位重复的数字-题解

news/2024/9/22 16:37:50/文章来源:https://www.cnblogs.com/StevenJiahao/p/18425484

题目传送门

一、举例说明

\(654923\) 为例
要判断在 \([0, 654923]\) 区间至少有一位重复的数值的数,可以考虑其补集,即\(\color{red}所有位数均不重复的数\),用 \(N\) 减去补集即为结果。
首先可以将其分为两种情况。

  • 情况一,位数小于 \(6\) 位。所有位数均不重复的有 \(9 \times 9 \times 8 \times 7 \times 6\) 种(首位不为0)。
  • 情况二,位数等于 \(6\) 位,这也可以分为两种情况,首位小于 \(6\) 或等于 \(6\) 。对于首位小于 \(6\) 的数据,所有位数均不重复的有 \(5 \times 9 \times 8 \times 7 \times 6 \times 5\) 种情况。

对于首位等于 \(6\) ,那么就要考虑次高位。可以定义一个 \(st\) 数组,来记录是否有重复的数,比如 \(654423\) ,枚举到第四位也是 \(4\) ,那么后两位无论是多少数字都无意义了,都一定没有不重复的数。因此用该数组判断某一个数字是否已被使用,已被使用就直接跳过。
从第二位 \(j=5\) 开始枚举,于是我们第二位考虑比 \(j\) 小的数即 \(0\)\(4\) ,加上后面四位不重复的数,即 \(8 \times 7 \times 6 \times 5 = P(8,4) = P(10-2,4)\),枚举后 \(st[5] = true\)
从第三位 \(j=4\) 开始枚举,于是我们第三位考虑比 \(j\) 小的数即 \(0\)\(3\) ,对于每一位数如果 \(st[k]\) 不为 \(true\) 的话,就说明此时这个数可以来当第三位数,加上后三位不重复的数即 \(7 \times 6 \times 5 = P(7,3) = P(10-3,3)\) ,枚举后 \(st[4] = true\)
以此将每一位数进行循环判定。每次循环完毕之后都判断一次,对应位数 \(j\) 是否重复有 \(st[j] = true\) ,如果重复了就不用继续往下面循环了,后面对应的数一定都重复。
最后跳出循环,同时我们在枚举的过程中,可以发现,第二位我们没有枚举 \(5\) ,第二位没有枚举 \(4\) …,第六位没有枚举 \(3\) ,如果能够枚举到这里,说明枚举过程中没有遇到重复的数,即这个数不是重复的数,所以要减去这个数。

二、代码实现

#include <bits/stdc++.h>
using namespace std;
int getSum(int a,int b){int res = 1;for(int i = a;b>0;b--,a--){res *= a;}return res;
}
vector<int>nums;
int numDupDigitsAtMostN(int n) {int res = n;//先将数整理为数组while(n) {nums.push_back(n % 10);n /= 10;}//情况一 比给定数位数少for(int i = nums.size() - 1;i > 0;i--){res -= 9 * getSum(9,i-1);}//情况二 和给定数位数相同 但最高位小于给定数最高位res -= (nums.back() - 1) * getSum(9,nums.size() - 1);//情况三 和给定数位数相同 最高位相同vector<bool> st(10);//然后去除首位的情况,设置首位为true不可再使用st[nums.back()] = true;for(int i = nums.size() - 2;i >= 0;i--){int j = nums[i];for(int k = 0;k < j;k++){//每次遇到前面用过的数就continueif(st[k]) continue;res -= getSum(10 - (nums.size() - i),i);}if(st[j]) {return res;}st[j] = true;}return res-1;
}
int main()
{int originNum;cin>>originNum ;cout<<numDupDigitsAtMostN(originNum);return 0;
}

如果你看到这里,你就浪费了2分钟,因为这代码太烦了(bushi

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

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

相关文章

Tarjan算法及其应用 总结+详细讲解+详细代码注释

\(\text{Tarjan}\) 1.引入概念 1.强连通分量 1.定义 在有向图 \(G\) 中,强连通分量就是满足以下条件的 \(G\) 的子图:从任意一点出发,都有到达另一个点的路径。 不存在一个或者几个点,使得这个子图加入这些点后,这个子图还满足上一个性质。为什么要限定”在有向图中“而不…

三级数据库技术笔记

数据库应用系统开发方法 数据库应用系统生命周期 软件工程与软件开发方法 瀑布模型 快速原型模型 螺旋模型 DBAS生命周期 DBAS生命周期:项目规划、需求分析、系统设计、实现与部署、运行与维护 规划与分析 可行性分析:经济可行性、技术可行性、操作可行性、开发方案选择 需求…

洛谷P5683 [CSP-J2019 江西] 道路拆除

立下flag:今天一定AC这道题! 题目意思: 思路: 然而并没有分。。 输出-1,祈求CCF的施舍( 30% 的数据,有 \(s_1 = s_2\) 求 1 号点到 \(s_1\) 最短路,再计算不需要的路径。 SPFA,启动! #include<bits/stdc++.h>using namespace std;const int maxn=3010; const i…

golang 项目引入私有仓库包

场景: 当你多个项目,都需要使用一个或者多个方法,那么可以将公共方法,抽成一个包,进行管理(类似Log模块等)。这时候可以将你的包上传到私有的仓库,其他项目引入该包即可。下面来介绍下,如何引用私有仓库的包。 1. 创建一个新的 Git 标签 假设你已经在你的私有 GitLab …

设计模式之——装饰者模式

前言: 装饰者模式是结构性设计模式之一,其在不必改变类文件及不适用继承的情况下,动态的扩展一个对象的功能。它通过创建一个包装对象(即装饰)来包裹真实的对象。 一.定义 动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。 装饰者模式的…

解决vsc中文乱码

关于vs code使用code runner运行python代码出现中文乱码的解决办法_code runner 运行乱码-CSDN博客 Code Runner插件设置 "set PYTHONIOENCODING=utf8 && python -u"

CSP-S 2024 提高组初赛第一轮初赛试题及答案解析

CSP-S 2024 提高组初赛第一轮初赛试题及答案解析 一、 单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项) 1 在 Linux 系统中,如果你想显示当前工作目录的路径,应该使用哪个命令?( ) A pwd B cd C ls D echo 答案 A 解析 A pwd:这个命令是“prin…

结对项目:四则运算题目生成

这个作业属于哪个课程 22级计科1班这个作业要求在哪里 作业要求这个作业的目标 自动生成小学四则运算题目github项目链接 链接姓名&学号姓名 学号万凯毅 3122004788周彦安 3122004804PSPPSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)Plannin…

帝国CMS搬家后无法发文章或者上传图片无法显示?

如果你在搬家后遇到无法发文章或上传图片的问题,通常是因为权限设置不当导致的。以下是一些详细的步骤来解决这些问题: 1. 检查目录权限 无法发文章检查栏目目录及子文件夹权限确保栏目目录及其子文件夹具有适当的权限。 通常需要将这些目录设置为 777 权限。shchmod -R 777 …

WordPress数据库连接失败是最常见的错误情况

WordPress数据库连接失败常见原因及解决方法 官方提示的三种情况数据库名、用户名或密码错误解决方法:检查并确认数据库名称、用户名和密码是否正确无误。数据库主机地址错误解决方法:通常填写localhost即可;如果是远程数据库,请根据主机提供商提供的地址进行填写。数据库未…

打靶记录 SickOS 1.1

https://www.vulnhub.com/entry/sickos-11,132/主机发现端口扫描探测存活主机,136是靶机,因为靶机是我最后添加的 nmap -sP 192.168.75.0/24 // Starting Nmap 7.93 ( https://nmap.org ) at 2024-09-22 11:36 CST Nmap scan report for 192.168.75.1 Host is up (0.00038s l…

简单部署Memos

从0到1借助宝塔面板快速部署Memos前言:此处以阿里云为例,利用宝塔面板部署 此文章是部署之后写的,因此有些截图是后补充的,缺少一些执行结果展示和详细步骤的缺失,请根据实际情况做调整准备购买阿里云服务器 ECS着手 创建实例进入阿里云控制台,我的资源→云服务器 ECS; …