荔枝丹(litchi)
荔枝丹(litchi)
题目描述
绛雪艳浮红锦烂,玉壶光莹水晶寒。
高名已许传新曲,芳味曾经荐大官。
乌府日长霜署静,几株斜覆石栏杆。
——明·陈辉《荔枝》
荔枝(丹),拼音为lizhidan,一种好吃的水果,深得悦色老师的喜爱。
祝阿姨得到了许多许多的荔枝丹,每个荔枝丹上都有一个00到99之间的数字。祝阿姨把它们分成许多组,每组表示一个数,且所有组表示的数字合起来恰好是[L,R][L,R]内的所有数。
祝阿姨知道悦色老师特别喜欢吃荔枝丹,于是邀请了悦色老师来吃荔枝丹。悦色老师最喜欢吃有数字00的荔枝丹了,她吃掉了所有数字为00的荔枝丹。
祝阿姨想知道还剩下多少不同的组。注意悦色老师吃完后,荔枝丹就无序了,也就是说123123和321321是同样的组。
输入
一行两个正整数L,RL,R。
输出
一行一个整数,表示还剩下多少不同的组。
样例输入
<span style="color:#333333"><span style="color:#333333">【样例1输入】
1 10
【样例2输入】
40 57
【样例3输入】
157 165
</span></span>
样例输出
<span style="color:#333333"><span style="color:#333333">【样例1输出】
9
【样例2输出】
17
【样例3输出】
9</span></span>
提示
【子任务】
测试点 |
R |
R-L |
1~2 |
≤106 |
≥0 |
3~4 |
≤1018 |
0≤R-L≤1000000 |
5~20 |
≥0 |
来源
solution
首先由18位的不同数码(无序)的数量为
C(27,9)约=4e6
所以我们可以枚举所有可能的数码,然后判断这个数码能否在[l,r]中出现
用go(pos,l_flag,r_flag),表示到了第pos位,当前获得的数字是否等于相应的L/R的前缀,返回当前枚举的字符串能否构造出来。
分类讨论:
如果pos == n,则返回true。
如果l_flag == 1 && r_flag == 1,进一步讨论:
如果L[pos] == R[pos],则在第pos位只能是L[pos],然后进行go(pos+1, 1, 1);
如果L[pos]<R[pos],那么如果可以放[L[pos]+1,R[pos]-1]中的数字,那么一定可行;如果不可以,则尝试放L[pos]并继续go(pos+1,1,0)或放R[pos]并继续go(pos+1,0,1)。
如果l_flag和r_flag有且仅有一个为真,则与上面的讨论类似,先考虑把那个卡边界的弄成不卡的,如果可行直接返回真,不可行就继续卡边界继续枚举。
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
ll l,r,L[20],R[20],ans,num[20],f[10];
bool pd(int k,int fl,int fr){
//cout<<k<<' '<<fl<<' '<<fr<<endl;
if(k==19)return 1;
if(fl==0&&fr==0)return 1;
if(fl==1&&fr==1){
if(L[k]==R[k]){
if(f[L[k]]){
f[L[k]]--;int t=pd(k+1,1,1);f[L[k]]++;
return t;
}
else return 0;
}
if(L[k]<R[k]){
for(int i=L[k]+1;i<R[k];i++)if(f[i])return 1;
bool can=0;
if(f[L[k]]){
f[L[k]]--;can|=pd(k+1,1,0);f[L[k]]++;
}
if(can)return 1;
if(f[R[k]]){
f[R[k]]--;can|=pd(k+1,0,1);f[R[k]]++;
}
return can;
}
if(L[k]>R[k])return 0;
}
if(fl==1){
for(int i=L[k]+1;i<=9;i++)if(f[i])return 1;
if(f[L[k]]){
f[L[k]]--;int t=pd(k+1,1,0);f[L[k]]++;
return t;
}
return 0;
}
if(fr==1){
for(int i=R[k]-1;i>=0;i--)if(f[i])return 1;
if(f[R[k]]){
f[R[k]]--;int t=pd(k+1,0,1);f[R[k]]++;
return t;
}
return 0;
}
}
void dfs(int k){
//cout<<k<<endl;
if(k==19){
for(int i=0;i<=10;i++)f[i]=0;
for(int i=1;i<=18;i++)f[num[i]]++;
//for(int i=0;i<=9;i++)cout<<f[i]<<' ';cout<<endl;
//for(int i=1;i<=18;i++)cout<<num[i];cout<<endl;
if(pd(1,1,1))ans++;
return;
}
for(int i=num[k-1];i<=9;i++){
num[k]=i,dfs(k+1);
}
}
int main(){
cin>>l>>r;
if(r==(ll)1e18){
if(l<=(ll)1e17)r--;
else r--,ans++;
}
int top=18;
for(top=18;top>0;top--)L[top]=l%10,l/=10;
for(top=18;top>0;top--)R[top]=r%10,r/=10;
//for(int i=1;i<=18;i++)cout<<L[i];cout<<endl;
//for(int i=1;i<=18;i++)cout<<R[i];cout<<endl;
dfs(1);
cout<<ans<<endl;
return 0;
}
荔枝丹(litchi)的更多相关文章
- 真正的RISC-V开发板——VEGA织女星开发板开箱评测
前言 由于最近ARM公司要求员工"停止所有与华为及其子公司正在生效的合约.支持及未决约定",即暂停与华为的相关合作,大家纷纷把注意力投向了另一个的处理器架构RISC-V,它是基于精 ...
- 【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境
喜欢今日头条,偶然看到广告,半个多月前交了8.9元,报名参加了头条上Python的四天培训课,呵呵,总算是有了零的开始(还是有点收获的,见https://www.sohu.com/a/38112874 ...
- 北工大耿丹学院16级计科院3班C语言课程助教学期总结
很荣幸得到邹老师,周老师,以及北工大耿丹学院各位老师的认可,担任计科院3班C语言课程助教,班主任为李光杰老师,很感谢李老师一学期的帮助,使得我更好的担任助教一职.我班学生31名,很愉快的与同学们度过一 ...
- 荔枝FM架构师刘耀华:异地多活IDC机房架构 - 极客头条 - CSDN.NET
荔枝FM架构师刘耀华:异地多活IDC机房架构 - 极客头条 - CSDN.NET 荔枝FM架构师刘耀华:异地多活IDC机房架构 - 极客头条 - CSDN.NET 途牛谭俊青:多数据中心状态同步&am ...
- [转]分布式消息中间件 MetaQ 作者庄晓丹专访
MetaQ(全称Metamorphosis)是一个高性能.高可用.可扩展的分布式消息中间件,思路起源于LinkedIn的Kafka,但并不是Kafka的一个Copy.MetaQ具有消息存储顺序写.吞吐 ...
- 北京工业大学耿丹学院2016下C作业学习总结
北京工业大学耿丹学院2016下C的班级地址在https://edu.cnblogs.com/campus/bjgygd/Sixteen-One . 第一次作业:两部分 第一部分:新建博客,书写第一篇随 ...
- 为嵌入式全志V3s荔枝派板卡添加USB MT7601U(小米随身WIFI)驱动
折腾了了一天终于scan出环境热点了,感觉本来挺简单的事情,网上教程一大把还费了一天的劲,很丧.不过网上教程虽多,但是还还是有些不同之处的,现在特意总结一下 全志V3s荔枝派板卡 添加该驱动的过程. ...
- [No0000F1]js获取喜马拉雅和荔枝FM电台专辑音频
荔枝FM小书签.txt javascript: (function() { if ($('#down_url')) { $('#down_url').remove(); }; $(document.b ...
- 20155331 丹增旦达 网络攻防 Exp2后门原理与实践
20155331 丹增旦达<网络攻防>Exp2后门原理与实践 实验内容 (1)使用netcat获取主机操作Shell,cron启动 (2)使用socat获取主机操作Shell, 任务计划启 ...
随机推荐
- 复习C++_基础、函数、数组、字符串
程序的开发过程 程序 源程序:用源语言写的,有待翻译的程序: 目标程序:源程序通过翻译程序加工以后生成的机器语言程序: 可执行程序:连接目标程序以及库中的某些文件,生成的一个可执行文件,例如Windo ...
- js数据结构处理--------树结构数据遍历
1.深度遍历 深度遍历利用栈来实现 class Stack { constructor () { this.top = 0, // 栈的长度 this.list = [] } push(item) { ...
- vue学习之路 - 3.基本操作(中)
基本操作(中) 本章节主要介绍:vue的条件渲染.列表渲染,计算属性和侦听器 条件渲染和列表渲染 条件渲染主要使用到了 v-if 指令,列表渲染主要使用了 v-for 指令. 下面介绍 v-if . ...
- 2018.11.3 Nescafe18 T2 太鼓达人
题目 背景 七夕祭上,Vani 牵着 cl 的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员 XLk.Poet_shy 和 ly ...
- 52shaidan.net
52shaidan.net 52gendan.net 朋友的域名
- dataTable 自定义排序
$("#id").DataTable({ aaSorting: [0, 'desc'], // 默认排序 aoColumnDefs: [ { "bSortable&qu ...
- Android_组件_Activity基础
一.概述 Activity是应用组件,提供了用户交互的窗口.一个应用由多个彼此联系的Activity组成.它大多数情况是全屏窗口显示,也可以作为悬浮窗口 或者 多窗口模式. 二.生命周期 下图是来自A ...
- python简单试题4
( ps : 题目中用到的一些random函数在最后末尾处有介绍) 1,在屏幕上显示跑马灯文字 import os # 调用os模块 import time # 调用时间模块 def main(): ...
- Python入门基础--变量与基本数据类型
变量 什么是变量 变量就是变化的量,变就是变化,量用于衡量描述对象的状态 为什么要有变量 程序执行的本质就是一系列状态的变化,变是程序执行的直接体现,所以我们需要有一种机制能够反映或者说是保存下来程序 ...
- [Hdu3652]B-number(数位DP)
Description 题目大意:求小于n是13的倍数且含有'13'的数的个数. (1 <= n <= 1000000000) Solution 数位DP,题目需要包含13,且被13整除, ...