题目链接:点击查看

题目大意:给出一个十进制数字 nnn 和一个约束 kkk,问大于等于 nnn 且满足不同的数位个数小于等于 kkk 的最小的数字是多少

题目分析:自己写的贪心太丑了,就不放上来丢人了

偷的杨大佬的trick,对于某个数字 xxx,如果可以快速求出区间 [1,x][1,x][1,x] 中有多少个数字满足不同的数位个数小于等于 kkk 的话,显然这个答案是具有单调性的

考虑二分答案,然后用数位dp快速求解这个过程,dp[pos][state][k]dp[pos][state][k]dp[pos][state][k] 记忆化一下到了第 pospospos 位置,当前不同的数位状态为 statestatestate,小于等于 kkk 的方案数。这里的 statestatestate 是一个 [0,210][0,2^{10}][0,210] 的数,也就是状压了一下状态

虽然时间复杂度看起来很不可观,但是据杨大佬的经验所述,均摊下来的时间复杂度为 O(很快)O(很快)O(很快)

代码:

// Problem: F2. Nearest Beautiful Number (hard version)
// Contest: Codeforces - Codeforces Round #739 (Div. 3)
// URL: https://codeforces.com/contest/1560/problem/F2
// Memory Limit: 256 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<list>
#include<unordered_map>
#define lowbit(x) (x&-x)
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
int dp[15][(1<<10)+10][10];
int b[15],cnt,k;
inline int count(int x) {return __builtin_popcount(x);
}
int dfs(int pos,int state,int limit,int lead) {if(pos==-1) {return count(state)<=k;}if(dp[pos][state][k]!=-1&&!limit&&!lead) {return dp[pos][state][k];}int up=limit?b[pos]:9;int ans=0;for(int i=0;i<=up;i++) {if(lead&&i==0) {ans+=dfs(pos-1,state,limit&&i==up,1);} else {ans+=dfs(pos-1,state|(1<<i),limit&&i==up,0);}}if(!limit&&!lead) {dp[pos][state][k]=ans;}return ans;
}
int solve(LL x) {cnt=0;while(x) {b[cnt++]=x%10;x/=10;}return dfs(cnt-1,0,1,1);
}
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);memset(dp,-1,sizeof(dp));int w;cin>>w;while(w--) {int n;read(n),read(k);int cur=solve(n-1);LL l=n,r=2e9,ans=-1;while(l<=r) {LL mid=(l+r)>>1;if(solve(mid)-cur>=1) {ans=mid;r=mid-1;} else {l=mid+1;}}printf("%lld\n",ans);}return 0;
}

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

  1. 1560F1. Nearest Beautiful Number (easy version)

    F1. Nearest Beautiful Number (easy version) 预处理加二分 #include <bits/stdc++.h> using namespace st ...

  2. SDUT - 2609 A-Number and B-Number(二分+数位dp)

    题目链接:点击查看 题目大意:规定 A 数组为所有十进制下含有 7 或者可以被 7 整除的数字,例如 A 数组中的前 10 个数为: {a[1]=7,a[2]=14,a[3]=17,a[4]=21,a ...

  3. CodeForces - 1486C2 Guessing the Greatest (hard version)(二分+交互)

    题目链接:点击查看 题目分析:给出一个长度为 nnn 的序列,现在可以进行最多 202020 次查询,每次查询可以询问区间 [l,r][l,r][l,r] 中次大值的位置,现在要求在查询后输出最大值的 ...

  4. Codeforces - 1118D2 - Coffee and Coursework (Hard Version) - 二分

    https://codeforces.com/problemset/problem/1118/D2 也是很好想的一个二分啦. 验证m的可行性的时候,肯定是把最多咖啡因的咖啡先尽可能平均分到每一天,因为 ...

  5. codeforces(D2. Coffee and Coursework (Hard Version))二分答案

    这题一看很容易想到二分,但我一开始想偏了,我是想枚举天数,然后二分去验证天数是否满足,但是这样二分验证天数是否满足这一步卡住了,写不出来. 然后我改成二分天数,验证天数是否满足这一步改成暴力计算,这样 ...

  6. CodeForces - 946E Largest Beautiful Number(贪心+模拟)

    题目链接:点击查看 题目大意:给出一个数位长度为偶数的数字 n,需要求出一个比 n 小的,且所有数位重新排列后可以形成回文串,要求这个数字尽可能大 题目分析:从最低位开始贪心,依次枚举每一位的数字,然 ...

  7. 【CodeForces - 361D】Levko and Array (二分,dp)

    题干: Levko has an array that consists of integers: a1, a2, ... , an. But he doesn't like this array a ...

  8. Codeforces Round #268 (Div. 1) C. Hack it! 数位dp + 构造数位

    传送门 文章目录 题意: 思路: 题意: 定义f(x)f(x)f(x)表示xxx的十进制下数位和,现在给你aaa,让你选一个区间[l,r][l,r][l,r],满足∑i=lrf(i)moda=0\su ...

  9. fzu 2109 Mountain Number 数位DP

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2109 题意: 如果一个>0的整数x,满足a[2*i+1] >= a[2*i]和a[2*i+2],则 ...

最新文章

  1. 一套基础自动化部署搭建过程
  2. mysql中decimal与float_MySQL中的float和decimal类型有什么区别
  3. git中的fork应该这样使用
  4. PHP的词法解析器:re2c
  5. 把指定用户的命令写在/home/etc/rc.local中,系统开机时就会自动执行指定用户的命令。
  6. 利用Matlab设计滤波器(FDAT)
  7. 「后端小伙伴来学前端了」CSS3伪元素选择器 ::before ::after | 记录自己的前端学习日子
  8. Java 9模块服务
  9. 使用Intersection Observer API创建无限加载组件
  10. karto探秘之open_karto 第三章 --- 扫描匹配
  11. 项目开发中遇到的问题,原因,解决思路
  12. CentOS 6.7下 Samba服务器的搭建与配置(share共享模式)
  13. java读取修改文件内容_JAVA读取文件指定内容进行修改
  14. 最高单价计算机函数公式,通达信公式主动性买盘均价,通达信分时图中 分时均价线黄线的源码怎么写...
  15. python爬取基金净值_Python爬虫周记之案例篇——基金净值爬取(上)
  16. 九安医疗预计第三季度净利7.56亿至10.56亿 上年同期为亏损
  17. Access数据库,以及一些其他的库。
  18. [每日一题]14:用54张不同的扑克牌构成牌堆,发给3个玩家。
  19. 计算机系统基础实验:二进制拆弹实验
  20. 怎么用计算机录像,怎么用电脑自带屏幕录制工具?免费录制方法

热门文章

  1. mysql在线检测失败_一则线上MySql连接异常的排查过程
  2. 编写python程序、计算账户余额_小明有20w存款存在余额宝中,按余额宝年收益为3.35%计算,用Python编写程序计算,多少年后小明的存款达到30w?...
  3. 为什么使用Maven
  4. Java的技术采⽤用⽣生命周期
  5. Spring5 源码下载注意事项
  6. ThreadLocal的第二种用法 part2
  7. 动态代理的概述和实现
  8. PageHelper概述与基本使用步骤介绍
  9. 小明爱跑步-扩展-多个对象属性之间互不干扰
  10. 循环嵌套-[扩展]print函数的结尾处理