荔枝丹(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, 任务计划启 ... 
随机推荐
- Python-Boolean operation
			一.布尔运算符 1.x and y: if x is false, then x, else y 2.x or y: if x is false, then y, else x 3.not x: if ... 
- java设计模式——单例模式(三)
			容器单例模式 之前学习Structs2,Spring框架时,经常会听到单例,多例.虽然这与单例模式不太一样,但是都很类似.在程序运行的时候,就加载所有的实例,然后用的时候直接取出 看下面代码: /** ... 
- webpack4简单入门
			安装webpack需要安装node环境,因此需要在电脑中安装node.node官网https://nodejs.org/,安装LTS版本即可. webpck基本概念 entry:分析依赖模块的入口 o ... 
- .NET利用RFC连接SAP,查询、读取SAP数据
			为黄朴整理!!!!!!!!!!!!!!!!! 在NuGet 添加 sapnco 一个简单的SAPCommand,方法 GetDataTableFromRFCTable 复制于 https://www. ... 
- iOS 闭包传值 和 代理传值
			let vc = ViewController() let navc = UINavigationController(rootViewController: vc) window = UIWindo ... 
- JavaScript中的match方法和search方法
			search在一个字串对象(string object)中查找关键词字串(规范表达式,regular expression),若匹配(即在目标字串中成功找到关键词)则返回关键词在目标字串中第一次出现的 ... 
- 学习 KMP 算法
			KMP 算法是用来处理字符串匹配问题的.也就是给你两个字符串,你需要回答:B 串是否是 A 串的子串(或 B 串在 A 串中出现的位置).比如,字符串 A = “ i am student ”, 字符 ... 
- 深入解析AJAX的原理
			AJAX:Asynchronous JavaScript And Xml(异步的JS和XML) 同步:客户端发起请求>服务端的处理和响应>客户端重新载入页面(循环) 异步:客户端实时请求& ... 
- 数据分析处理库Pandas——概述
			导入Pandas库 创建DataFrame结构 读取.csv文件 titanic_train.csv文件:https://files.cnblogs.com/files/gloria-zhang/ti ... 
- BFS:胜利大逃亡
			解题心得: 1.水题,主要主意好一个点就好. 2.注意x.y.z坐标的选取就好. 题目: Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城 ... 
