[Cqoi2015] 编号 【逆向思维,暴力枚举】
Online Judge:Luogu-P4222
Label:逆向思维,暴力枚举
题目描述
你需要给一批商品编号,其中每个编号都是一个7位16进制数(由0~9, a-f组成)。为了防止在人工处理时不小心把编号弄错,要求任意两个编号至少有三个位置对应的数字不相同。第一个编号为0000000,第二个编号为不违反上述规定的前提下最小的编号,…,每次分配一个新编号时,总是选择不和前面编号冲突的最小编号(注意编号都是16进制数,可以比较大小)。按此规律,前面若干编号分别是:0000000, 0000111, 0000222, …, 0000fff, 0001012, 0001103,0001230,0001321,0001456,…
输入k,你的任务是求出第k小的编号。
输入
第一行为整数k。
输出
输出第k小的编号(字母必须输出小写)。输入保证这个编号存在。
样例
Input
20
Output
0001321
Hint
对于30%的数据,\(k \leq 200\);
对于70%的数据,\(k \leq 10000\);
对于100%的数据,\(k \leq 200000\)。
题解
第一眼以为二分答案,但是发现每个值都依赖于前面的数字。需要依次求解。
30pts:
直接暴力枚举16进制数,检验时,暴力与前面的数比较。
时间复杂度为\(O(Ans+K^2*7)\)。其中从小到大枚举数字共\(Ans\)次,每次检验时与前面的数字一位一位比较。
70pts:
尝试打表找规律,然后你会发现,除了最后两个16进制位规律比较迷之外,剩下的前面5位规律都是显而易见的。所以直接打表后面两个位(如果代码长度限制允许的情况下),可以在O(1)时间内求解。
100pts:
这个数据范围显然如果按刚才的方案去打表不太可行(但这题也有很多其他能够AC的神奇打表+哈希做法)。下面是一种比较简洁的做法:
回到30分做法,显然还是需要依次求解,那就尝试优化后面的比较部分。采用逆向思维,当前数字与前面的数字比较,就算枚举都要O(N),不可做;那就尝试用当前的数,对后面合法/不合法的数字打上标记。
原题面:至少要有3个对应位不同,才合法;
其实就是:只要存在至少5个对应位相同,就不合法。
比较相同
显然比比较不同
可做很多。对于当前弄到的一个合法数字,我们利用组合,按顺序挑出7个中的5个,将这个 组合\(mark\)了,注意,由于要控制对应位,还得记录下这是\(C_7^5=21\)中的第几个组合。
对应的,当判断当前这个数字合不合法时,也是按顺序挑出7个中的5个,如果被\(mark\)了则表示这个数字不合法;反之如果所有组合都没被\(mark\)过,表示这个数字合法。
综上,每次枚举时都可以在\(C_7^5\)的时间内判断是否合法。
代码如下:
#include<bits/stdc++.h>
#define For(a,b,c) for(a=b;a<=c;a++)
using namespace std;
int n,x[10],a,b,c,d,e,f;
bool mark[22][16][16][16][16][16];
inline void out(int c){putchar(c<=9?c+'0':c-10+'a');}
inline bool insert(){
register int id=0;
For(a,0,6)For(b,a+1,6)For(c,b+1,6)For(d,c+1,6)For(e,d+1,6){
if(mark[++id][x[a]][x[b]][x[c]][x[d]][x[e]])return 0;
}
id=0;
For(a,0,6)For(b,a+1,6)For(c,b+1,6)For(d,c+1,6)For(e,d+1,6){
mark[++id][x[a]][x[b]][x[c]][x[d]][x[e]]=1;
}
}
int main(){
scanf("%d",&n);
For(x[0],0,15)For(x[1],0,15)For(x[2],0,15)For(x[3],0,15)
For(x[4],0,15)For(x[5],0,15)For(x[6],0,15)if(insert()){
if(!--n){
int i;For(i,0,6)out(x[i]);
return 0;
}
}
}
[Cqoi2015] 编号 【逆向思维,暴力枚举】的更多相关文章
- CodeForces 742B Arpa’s obvious problem and Mehrdad’s terrible solution (暴力枚举)
题意:求定 n 个数,求有多少对数满足,ai^bi = x. 析:暴力枚举就行,n的复杂度. 代码如下: #pragma comment(linker, "/STACK:1024000000 ...
- 2014牡丹江网络赛ZOJPretty Poem(暴力枚举)
/* 将给定的一个字符串分解成ABABA 或者 ABABCAB的形式! 思路:暴力枚举A, B, C串! */ 1 #include<iostream> #include<cstri ...
- HNU 12886 Cracking the Safe(暴力枚举)
题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12886&courseid=274 解题报告:输入4个数 ...
- 51nod 1116 K进制下的大数 (暴力枚举)
题目链接 题意:中文题. 题解:暴力枚举. #include <iostream> #include <cstring> using namespace std; ; ; ch ...
- Codeforces Round #349 (Div. 1) B. World Tour 最短路+暴力枚举
题目链接: http://www.codeforces.com/contest/666/problem/B 题意: 给你n个城市,m条单向边,求通过最短路径访问四个不同的点能获得的最大距离,答案输出一 ...
- bzoj 1028 暴力枚举判断
昨天梦到这道题了,所以一定要A掉(其实梦到了3道,有两道记不清了) 暴力枚举等的是哪张牌,将是哪张牌,然后贪心的判断就行了. 对于一个状态判断是否为胡牌,1-n扫一遍,然后对于每个牌,先mod 3, ...
- POJ-3187 Backward Digit Sums (暴力枚举)
http://poj.org/problem?id=3187 给定一个个数n和sum,让你求原始序列,如果有多个输出字典序最小的. 暴力枚举题,枚举生成的每一个全排列,符合即退出. dfs版: #in ...
- hihoCoder #1179 : 永恒游戏 (暴力枚举)
题意: 给出一个有n个点的无向图,每个点上有石头数个,现在的游戏规则是,设置某个点A的度数为d,如果A点的石子数大于等于d,则可以从A点给每个邻接点发一个石子.如果游戏可以玩10万次以上,输出INF, ...
- CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)
问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...
随机推荐
- 最大流——poj1459
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using ...
- (JS)应为","
在写cshtml的时候,vs提示:(JS)应为"," 功能无法实现,一般是因为 标点切成全角了,但是我是应为把‘’打成了“” 以下错误示范: $("ol").a ...
- PHP如何实现百万级数据导出
公司目前有一个需求,需要对一个日增量在20万+数据量的数据表中的数据进行可自定义条件筛选的导出数据,该功能需要对多个部门进行开发使用,要保证功能可用的前提下,尽量优化体验. 首先介绍一下当前可利用的资 ...
- Kafka和RabbitMQ 对比
1) Kafka成为业界大数据松耦合架构,异步,队列 特点:吞吐量高50m/s. Kafka和RabbitMQ都是MQ机制,它差异 Kafka作为大数据产品,可以作为数据源,也可以作为结果数据中转 ...
- spring事务管理几种方式
前段时间对spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. ...
- Spring MVC(十四)--SpringMVC验证表单
在Spring MVC中提供了验证器可以进行服务端校验,所有的验证都必须先注册校验器,不过校验器也是Spring MVC自动加载的,在使用Spring MVC校验器之前首先要下载相关的jar包,下面是 ...
- 如何在VUE项目中使用SCSS
首先要了解什么是CSS 预处理器? SCSS是一种CSS预处理语言 定义了一种新的专门的编程语言,编译后形成正常的css文件,为css增加一些编程特性,无需考虑浏览器的兼容性(完全兼容css3),让c ...
- Searching the String ZOJ - 3228 AC自动机查询升级版
题意:先给你一个不超过1000000长度的大串s:接下来输入一个n代表接下来输入的小串个数,小串长度不超过6. 小串分两种类型0和1类型. 0类型表示小串在大串中的最大匹配个数就是常规的AC自动机的做 ...
- springcloud系列15 bus的使用
可以结合wekbbok进行通知: 将更新的代码进行点击就好:
- [WPF自定义控件库] 让Form在加载后自动获得焦点
原文:[WPF自定义控件库] 让Form在加载后自动获得焦点 1. 需求 加载后让第一个输入框或者焦点是个很基本的功能,典型的如"登录"对话框.一般来说"登录" ...