CodeForces - 1560F2 Nearest Beautiful Number (hard version) ( 二分 + 数位dp )

国央企创新负责人如何通过平台实现科研成果的快速识别与转化?.docx 科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。 立即下载
题目链接:点击进入
题目

在这里插入图片描述
在这里插入图片描述

题意

就是求 >= n 的数中,最小的,满足 k 美丽数的数。
k 美丽数,是指数中不同的数字的数量 <= k

思路

一开始没想到数位,寄!
数位dp的一次solve计算的结果通常以类似前缀和的结果返回 ( 就是返回 [ 1 , r ] 内满足条件的数的个数 )
二分答案,考虑 solve ( mid ) - solve ( n - 1 ) 的值,这个值具有单调性(结合上面的结论,大概就知道,mid 越大,solve ( mid ) - solve ( n - 1 ) 的值越大或不变,取 n - 1 是题目说答案要 >= n )。
剩下的,,,就是dp记录的状态了。
dp [ pos ] [ state ] [ j ] :k = j 时,前 pos 位状态为 state 时的情况数。
这里state实际上记录的是到目前为止不同数字的数量,因为数字一共9种,对于数字i,采用state|(1<<i)就可以将它记录到state中,但是这时候state实际上是一个或值,它二进制下1的个数就是不同数字的数量,可以用__builtin_popcount(state)函数解决。
还得考虑前导零的影响,前导零不可以计入状态。
最后一位的 j ,不可以少 ( 我的少不了 ) ,会 T ( 我的会 T ),要是二维 dp [ pos ] [ state ] 在加上每个 k 都 memset 一下dp 数组,也可以出答案,但是会 T ,可能是因为 k 只有 10 种,中间会有大量重复的 k ,因此将每个 k 的情况记录下来,而不是每次 memset 重新求,那样耗时间。

代码
//#pragma GCC optimize(3)//O3
//#pragma GCC optimize(2)//O2
#include<iostream>
#include<string>
#include<map>
#include<set>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<fstream>
#define X first
#define Y second
#define best 131 
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define lowbit(x) x & -x
#define inf 0x3f3f3f3f
// #define int long long
//#define double long double
//#define rep(i,x,y) for(register int i = x; i <= y;++i)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double pai=acos(-1.0);
const int maxn=1e6+10;
const int mod=1e9+7;
const double eps=1e-9;
const int N=5e3+10;
/*--------------------------------------------*/
inline int read()
{
    int k = 0, f = 1 ;
    char c = getchar() ;
    while(!isdigit(c)){if(c == '-') f = -1 ;c = getchar() ;}
    while(isdigit(c)) k = (k << 1) + (k << 3) + c - 48 ,c = getchar() ;
    return k * f ;
}
/*--------------------------------------------*/

int t,n,k,cnt[1030];
int a[20];
ll dp[20][1030][12];
ll dfs(int pos,int pre,int state,bool lead,bool limit)
{
	if(pos==-1&&__builtin_popcount(state)<=k) return 1;
	if(!limit&&!lead&&dp[pos][state][k]!=-1) return dp[pos][state][k];
	int up=limit?a[pos]:9;
	ll res=0;
	for(int i=0;i<=up;i++)
	{
		if(i==0&&lead) res+=dfs(pos-1,i,state,lead&&i==0,limit&&i==a[pos]);
		else
		{
			if(__builtin_popcount((state|(1<<i)))>k) continue;
			res+=dfs(pos-1,i,(state|(1<<i)),lead&&i==0,limit&&i==a[pos]);
		}
	} 
	if(!limit&&!lead) dp[pos][state][k]=res;
	return res;
}
ll solve(int x)
{
	int pos=0;
	while(x)
	{
		a[pos++]=x%10;
		x/=10;
	}
	return dfs(pos-1,-1,0,1,1);
}

int main() 
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);cout.tie(0);
	memset(dp,-1,sizeof(dp));
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&k);
		ll num=solve(n-1);
		ll l=n,r=2e9,ans=0;
		while(l<=r)
		{
			int mid=l+r>>1;
			if(solve(mid)-num>=1)
			{
				r=mid-1;
				ans=mid;
			}
			else
				l=mid+1;
		}
		printf("%lld\n",ans);
	}
    return 0;
} 
PotPlayer自用皮肤 自用 PotPlayer 皮肤,仅微调了字体大小与颜色,是按个人习惯调整,未做适配性调整。 立即下载

相关推荐

2-shell及常用命令-续.pdf

2-shell及常用命令-续.pdf

F2. Nearest Beautiful Number (hard version)

题意 给定两个正整数n, k,求最小正整数x,x满足x>=n且x的各位数字中不同数字的个数不超过k 问题转换 首先基于求解最小的满足条件的正整数,我们应当从最高位开始判断合法性,以使得需要增大的位尽可能的低,这里没有采用需要改变而是需要增大,其原因在于,对于该位后的数字,基于最小的要求,应当尽可能小,也就是后续片段也会相应的发生变化。 这样就分解为了两个子问题 ①应当将哪一位增大 ②后续位数字的最小状态是什么 首先解决问题① 对于一个片段,当我们需要对它处理时,显然这个片段中存在超过k个数字,那么我们

qq_52372074的博客 385

Pointnet++环境配置+复现

深度学习点云经典网络Pointnet++

weixin_58663121的博客 8075

CodeForces - 1560F2 Nearest Beautiful Number (hard version)(二分+数位dp)

题目链接:点击查看 题目大意:给出一个十进制数字 nnn 和一个约束 kkk,问大于等于 nnn 且满足不同的数位个数小于等于 kkk 的最小的数字是多少 题目分析:自己写的贪心太丑了,就不放上来丢人了 偷的杨大佬的trick,对于某个数字 xxx,如果可以快速求出区间 [1,x][1,x][1,x] 中有多少个数字满足不同的数位个数小于等于 kkk 的话,显然这个答案是具有单调性的 考虑二分答案,然后用数位dp快速求解这个过程,dp[pos][state][k]dp[pos][state][k]dp[po

Falcon的博客 524

系统设计---算法与架构

这片文章对系统设计的具体步骤及相关知识进行介绍,主要分为四部分:算法设计、IC系统架构设计、基于systemC的IC系统设计、系统设计工具SPW简介。 (一)算法设计 系统设计的第一步是给出清晰的系统规范,该规范写明了系统的功能、性能、费用、开发时间等。接下来创建一个系统行为模型,并且可以用来初步验证设计的性能。再下来,对行为模型进行细化,即进行算法设计。算法设计大致分为三步: 1)给出浮点

正在努力的ICer的博客 4373

【银行测试】手机银行APP专项项目+测试点汇总(一)

1、手机银行APP转账项目讲解面试官:请介绍一下你所负责的模块如何进行的测试?求职者:好的,我最近测试的是XX银行的手机银行App项目。这个项目里面包含了转账、转账额度调整、网银转账、交易明细、添加账户、存款、投资理财、生活缴费等功能模块。我主要负责了转账模块,这个大模块中包含了智能转账、手机转账、语音转账、预约转账、收款人管理等5个子模块,我首先介绍一下我们生活中使用最多的手机转账子模块。对于转账需要关注的是转账前、转账中、转账后这三个状态下的测试。

m0_70102063的博客 1604

Binary Table (Hard Version)-(思维)

题目描述:点击进入 题意 给你一个大小为n×m的二进制表,这个表由符号 0 和符号 1 组成。 你可以进行这样的操作: 选择属于一个 2 × 2 正方形的 3 个不同的单元格,并更改这些单元格中的符号(将 0 更改为1, 1 更改为 0 )。 你的任务是使表中的所有符号都等于0。您最多可以进行 nm次 操作。 你不需要最小化操作的数量。 思路 这是上一题的加强版,操作次数变为 nm 了,我上一次的代码过不去,无奈只能优化,但也只是对边界处理优化了一下,却神奇过了(神奇神奇,用xy哥的话来说那就是可蒸馏啊)

Cosmic_Tree的博客 1780

Halcon —— 图像像素类型与转换

图像类型 就目前工业领域主流的图像处理工具halcon来讲,有以下几张图像类型:‘byte’, ‘complex’, ‘cyclic’, ‘direction’, ‘int1’, ‘int2’, ‘int4’, ‘int8’, ‘real’, ‘uint2’,具体含义如下图所示。相互间的转换可通过convert_image_type算子完成,但盲目转换会导致图像像素值异常。 ‘byte’ 每像素1字节,无符号 值范围: (0到255) ‘int1’ 每像素1字节,有符号 值范围: (-128到127) ‘

baidu_35536188的博客 1万+

k-LCM ( easy version && hard version ) -( 思维 - 构造 )

题目链接(easy):点击进入 题目链接(hard):点击进入 题目 题意 长度为 k 的数组,整个数组的和为 n ,整个数组的最小公倍数不超过 n / 2,让你构造这样一个数组 简单版本k=3,困难版本 3 <= k <= n。 思路 简单版本: 因为明确告诉你了 k = 3 ,同时要求三个数的最小公倍数不能超过 n / 2,所以我们可以根据 n 来构造这个三个数。 首先根据 n 的奇偶性分类讨论 如果 n 是奇数,那么三个数可以变为 n / 2 , n / 2 , 1 ; 如果 n 是偶

Cosmic_Tree的博客 1189

WiFi基本概念(六)(L-STF,L-LTF)

L-STF它由10个OFDM symbol(1,0,1,0,1,0,1,0,1,0)构成,每个symbol是0.8us,GI是0.2us,总计10us。Symbol的长度是正常长度的1/4,因此称为Short training field,主要用于快速进行信号检测,信号同步,自动增益控制,接收天线选择(Diversity Selection)。 由于symbol长度是正常的1/4,子载波的宽度是正常的4倍,能进行初略的信道估计,其使用了-24, -20, -16, -12, -8, -4, 4, 8, 1

reekyli的专栏 6862

基于多传感器融合的智身四足机器狗楼梯环境SLAM系统设计与实现

本文设计了一种基于多传感器融合的四足机器狗楼梯环境SLAM系统。系统采用Jetson Orin NX为主控制器,集成RealSense D435i深度相机和Livox Mid360激光雷达,在ROS2框架下实现平面定位精度<5cm、楼梯环境下导航不漂移的目标。通过多层次传感器融合策略、运动学约束优化和状态切换机制,解决了楼梯环境下的定位累积误差问题,实现了平面与楼梯环境的自动识别切换及精度复位功能。硬件设计注重传感器布局优化和精确标定,软件架构采用分层设计,确保实时性能。该系统为四足机器人在复杂地形中

huanghm88的专栏 240

Binary Table (Easy Version)-(思维)

题目描述:点击进入 题意 给你一个大小为n×m的二进制表,这个表由符号 0 和符号 1 组成。 你可以进行这样的操作: 选择属于一个 2 × 2 正方形的 3 个不同的单元格,并更改这些单元格中的符号(将 0 更改为1, 1 更改为 0 )。 你的任务是使表中的所有符号都等于0。您最多可以进行 3nm次 操作。 你不需要最小化操作的数量。 思路1 通过找找规律,我们可以知道一个 2*2 的矩阵 不包含0的可以通过一次操作变为包含3个0的, 包含3个0的通过一次操作可以变为包含2个0的, 包含2个0的通过一次

Cosmic_Tree的博客 840

Claude Code Skills 入门:内置技能与自定义技能开发

│ Skill 的特点 │1. 封装性:把复杂操作封装成简单命令2. 可复用:一次定义,随处使用3. 可定制:支持参数传入4. 可发现:通过 /skill-name 方式调用打个比方,如果说 Claude Code 的基础工具是「原材料」,那 Skills 就是「预制菜」——只需要简单加热(调用),就能得到成品(结果)。你可以创建自己的 Skill 来封装常用操作。Skill 支持参数,通过。

gaoxiang_120的专栏 670

Codeforces Beta Round #68 - B- Train ( 贪心模拟 )

题目链接:点击进入 题目 题意 偷渡者和控制者玩以下游戏。 火车由 n 节车厢表示,车厢从头到尾用 1 到 n 的正整数编号。偷渡者和控制者最初在两辆不同的货车中。火车每分钟都可能处于两种状态移动或空闲。控制者每分钟都在移动。 控制器有运动方向——火车头或火车尾。在移动期间,控制者对应于其移动方向移动到相邻的货车。如果在他的移动结束时,控制者进入第 1 辆或第 n 辆货车,那么他将移动方向更改为另一侧。换句话说,控制者在整个游戏过程中循环地从火车的头部到尾部然后再返回,在每次移动期间移动一辆车。请注意,

Cosmic_Tree的博客 747

【STM32 CubeMX】I2C中断方式与DMA方式

在STM32 CubeMX环境中,I2C(Inter-Integrated Circuit)通信协议的实现可以采用中断方式或DMA(Direct Memory Access)方式。中断方式通过触发中断来处理数据传输,而DMA方式则利用直接内存访问技术来实现数据传输,减轻了CPU的负担。在选择I2C通信方式时,开发者需要根据具体的应用需求和性能要求来选择合适的方式。STM32 CubeMX提供了图形化配置工具,使得配置I2C通信方式变得更加便捷。

m0_62599305的博客 7744

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

CodeForces - 1549C - Web of Lies( 思维 )

题目链接:点击进入 题目 题意 n个人m对朋友关系( 双向 ),q次操作: 1 u v u与v成为朋友 2 u v u与v朋友关系破灭 3 计算以下过程的答案: 过程:所有易受伤害的贵族同时被杀害,他们的友谊也随之结束。这样,新贵族就有可能变得脆弱。这个过程不断重复,直到没有贵族受到伤害。可以证明,这个过程将在有限的时间内结束。完成此过程后,您需要计算剩余贵族的数量。( 如果满足以下两个条件,则贵族被定义为易受攻击:至少有一个朋友,那位贵族的所有朋友都有更高的权力。) 注意,该过程的结果不会在查询

Cosmic_Tree的博客 634

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

CodeForces 1267

题目:B–Balls of Buma 题意 给你一个字符串(代表不同颜色),让你插入一个字符(一种颜色)后,可以消掉整个字符串。(相同颜色、长度变长、长度>=3才会抵消) 思路 将原串变成“种类串”(例如:AABBAA—> ABA)后,“种类串”应当是回文串,且长度应该是奇数。 同时,一个可以被消去的串,根据中心对称的同类部分的长度和,应当>=3。中心部分长度应当>=2.满足以上条件,答案为中心部分答案+1; 代码 #include<iostream> #include&

Cosmic_Tree的博客 583

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

CodeForces - 1549D - Integers Have Friends ( 差分 - 线段树 - 双指针 )

题目链接:点击进入 题目 题意 定义一个友好区间为,存在一个 m ( m >= 2 ),使区间内的所有数 % m 值相等,让你求给定数组的最大友好区间长度。 思路 如果两个数 x , y , 取模后的值相同,则需要满足:| x - y | % mod == 0。 若是一个区间内 % mod 值相等,则是所有差值的 gcd。 所以根据这一特性,我们不难想到对原数组差分,然后区间求 gcd( 区间求 gcd 可以用线段树来实现 ),然后我们再用双指针维护一个 右端点 指定 的情况下 左端点最远 且

Cosmic_Tree的博客 577

CodeForces - 1557C - Moamen and XOR ( 位运算 + 排列组合 )

题目链接:点击进入 题目 题意 规定长度为 n 的数组要是满足 a1a_1a1​&a2a_2a2​&…ana_nan​ >= a1⊕a2⊕a_1 \oplus a_2 \oplusa1​⊕a2​⊕…⊕an\oplus a_n⊕an​ 则认为是胜利。在每个数组元素小于 2k2^k2k 的前提下,问有多少种数组 a 满足胜利的条件。 思路 看到这个 2k2^k2k ,当时就想到多半按位来看。若是固定每一位,然后看 n 个数这一位的与运算 与 n 个数这一位的异或运算。异或运算有个规律,

Cosmic_Tree的博客 570

Codeforces Round #171 (Div. 2) - E - Beautiful Decomposition( 贪心 )

题目链接:点击进入 题目 题意 给你一串值为 n 的二进制串,一个加数可以是 ( + / - ) 2 ^ k ( k >= 0 ) ,求最少的加数凑成 n ( 没有前导零 ) 思路 若这个串只有一个1,显然只需要一次即可; 否则,我们可以用减法来求得这个数,例如:11010 = 100000 + 00010 - 01000 反过来就是 11010 - 00010 + 01000 = 100000 ,也就是用最小的加数使原数(x位)变成2^x( 若原数是11…就是变成2 ^ x,若原数是10…就是变成

Cosmic_Tree的博客 545

Eastern Exhibition-(二维中位数)

题目链接:点击进入 题目 题意 n个二维平面上的点,让你在整数坐标中找一个距离这n个点距离之和最近的点,求这样的点有多少个。 思路 二维中位数,将二维的坐标分别投射到一维的x轴和y轴上,再分别取一维中位数(奇数时,中位数是中间数;偶数时,中位数是中间两个数中间的所有数),将取得的两个中位数求乘积即为答案 代码 #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> usi

Cosmic_Tree的博客 545

Codeforces Round #764 (Div. 3) - G - MinOr Tree ( 贪心 )

题目连接:点击进入 题目 题意 n 个点 m 条边,求最小或 ( or ) 生成树,即树的所有边或值最小。 思路 由于是求最后所有边或的值最小,或值即对于生成树的所有边来说,他们的每个对应位只要有一个 1 那么这位最终就是 1 ,要是想结果尽可能小,那么我们当然是希望每个对应位都是 0 才好,如果无法为 0 ,那么这一位越低越好,因此我们可以从高位往低位枚举每一位,如果这一位全 0 的边能够凑成一棵生成树,那么这一位为 1 的边就可以不要,那么最终结果的这一位就可以为 0 。要是凑不成,那么说明需要

Cosmic_Tree的博客 541

Codeforces Round #680 C-Division(数论+分解质因子)

题意 给你两个数字 p , q ,让你求满足( p % x == 0 && x % q != 0 )的最大的 x 思路 这里我们用n,m来代替p,q 如果 n % m != 0 那么最大的 x 就是 n 如果 n % m == 0 , 我们知道 假设 如果 n % x == 0 t1 <= e1 , t2 <= e2 … tk <= ek; 又因为 n % m == 0 f1 <= e1 , f2 <= e2 … fk <= ek 如果想让 x ..

Cosmic_Tree的博客 540

Educational Codeforces Round 32 - G. Xor-MST ( 01字典树 + 分治 )

题目链接:点击进入 题目 题意 给你 n 个点的值,n 个点加边生成一棵树,边权就是两点的异或值,要求最后所有边权和最小。输出最小边权和。 思路 将 n 个数插入到01字典树上,对于树上的每个节点,记录这个节点保存有原数组的那些数(就是原数组中有哪些数经过这个节点),因为这些数可能在原数组中是无序的所以不好保存,因此我们可以将原数组排序后再插入字典树,这样每个节点所保存的数就是连续的,也就是每个节点只记录这个连续区间的边界即可。 遍历01字典树, 对于两个孩子的节点,左右孩子代表的区间是不同的,代表未连接

Cosmic_Tree的博客 519

CodeForces - 1541B - Pleasant Pairs( 质因子分解 )

题目链接:点击进入 题目 题意 长度为 n 的数组 a ,求满足 i < j && a [ i ] * a [ j ] == i + j 的( i , j )对数。 思路 枚举 sum = i + j ,对于每个 sum 质因子分解,对于每个因子 q , 判断 q 以及 sum / q 是否存在 ,同时判断两者对应的坐标相加是否等于 sum 。 代码 // Problem: B. Pleasant Pairs // Contest: Codeforces - Codeforces

Cosmic_Tree的博客 515

CodeForces - 1509C - The Sports Festival( 区间dp )

题目链接:点击进入 题目 题意 长度为 n 的数组 a [ i ] ,数组可以随意排序,求最小的 d [ 1 ] + … + d [ n ] 和 d [ i ] = max ( a [ 1 ] , , , a [ i ] ) - min ( a [ 1 ] , , , a [ i ] ) ; 思路 区间 dp dp [ i ] [ j ] 表示区间 [ i , j ] 的最小 d 和 区间 [ l , r ] 由区间 [ l + 1 , r ] 跟 [ l , r - 1 ] 转移来,额外增加的贡献

Cosmic_Tree的博客 484
上一篇: HDU - 7071 Guess the weight ( 思维 + 树状数组上二分 )
下一篇: HDU - 1556 - Color the ball ( 差分 )
Cosmic_Tree
博客等级 码龄7年 134粉丝 337原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值