ztr loves lucky numbers 傻逼的我来了个大模拟
http://acm.hdu.edu.cn/showproblem.php?pid=5676
这题的正解因该是dfs的,但是有18个位,然后我一算,全排列的话,有18!个啊,那不是很大?但是有很多是相同的,因为4477和第一个和第二个数字调转的结果是一样的。
先说说我模拟的方法。
真的很麻烦,不想看的,给几组数据就跑
7
0
8
4500
47
55
44447778
78
47777445
我是贪心模拟前n位,模拟的时候,如果这一位是3,如果我还有4,那么证明比后面的大了,然后后面的直接按4优先输出即可。
还有可能要加位的,就是78这样,要加位。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = 1e2 + ;
char str[maxn];
char ans[maxn];
int findnotseven(int begin, int end) {
for (int i = end; i >= begin; --i) {
if (ans[i] != '') return i;
}
return inf;
}
void work() {
for (int i = ; i <= ; ++i) str[i] = '';
scanf("%s", str + );
int lenstr = strlen(str + );
bool big = false;
int lenans = lenstr;
int four;
int seven;
if (lenstr & ) {
big = true;
four = lenstr / + ;
seven = lenstr / + ;
lenstr++;
} else {
four = lenstr / ;
seven = lenstr / ;
}
int tnow = ;
int add = ;
int pos = false;
char what;
for (int i = ; i <= lenstr; ++i) {
if (big) {
if (four) {
ans[++tnow] = '';
four--;
} else if (seven) {
ans[++tnow] = '';
seven--;
} else while();
} else {
if (str[i] > '') {
if (pos) {
ans[pos] = what;
four = ;
seven = ;
for (int k = ; k <= pos; ++k) {
four += ans[k] == '';
seven += ans[k] == '';
}
four = lenstr / - four;
seven = lenstr / - seven;
big = true;
i = pos;
tnow = pos;
} else {
add = ;
big = true;
four = (lenstr + ) / - ;
seven = (lenstr + ) / ;
i = ;
tnow = ;
}
} else {
if (str[i] >= '' && str[i] <= '') {
if (seven) {
ans[++tnow] = '';
seven--;
if (str[i] != '') {
big = true;
four = ;
seven = ;
for (int k = ; k <= i; ++k) {
four += ans[k] == '';
seven += ans[k] == '';
}
four = lenstr / - four;
seven = lenstr / - seven;
//************//
pos = i;
what = '';
}
} else { //也要改
if (pos) {
ans[pos] = what;
four = ;
seven = ;
for (int k = ; k <= pos; ++k) {
four += ans[k] == '';
seven += ans[k] == '';
}
four = lenstr / - four;
seven = lenstr / - seven;
big = true;
i = pos;
tnow = pos;
} else {
add = ;
big = true;
four = (lenstr + ) / - ;
seven = (lenstr + ) / ;
i = ;
tnow = ;
}
}
} else {
if (four) {
ans[++tnow] = '';
four--;
if (str[i] != '') {
big = true;
four = ;
seven = ;
for (int k = ; k <= i; ++k) {
four += ans[k] == '';
seven += ans[k] == '';
}
four = lenstr / - four;
seven = lenstr / - seven;
pos = i;
what = '';
} else {
if (seven) {
pos = i;
what = '';
}
}
} else if (seven) {
ans[++tnow] = '';
seven--;
big = true;
four = ;
seven = ;
for (int k = ; k <= i; ++k) {
four += ans[k] == '';
seven += ans[k] == '';
}
four = lenstr / - four;
seven = lenstr / - seven;
pos = i;
what = '';
pos = i;
what = '';
}
}
}
}
}
while (add--) {
printf("");
}
for (int i = ; i <= tnow; ++i) {
printf("%c", ans[i]);
}
printf("\n");
} int main() {
#ifdef local
freopen("data.txt","r",stdin);
#endif
int t;
scanf("%d", &t);
while (t--) work();
return ;
}
说一下按位DFS的做法
预处理出所有结果,首先要知道有多少种结果
当数字有18位的时候,9位4,9位7, 那么C(18, 9)的意思就是选9个位置来放四,其他的放7,那么结果就是C(18,9)
所以总答案数只有66196种。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = 1e6 + ;
LL ans[maxn];
int lenans;
void dfs(LL now, int num_four, int num_seven) {
if (num_four == && num_seven == ) {
ans[++lenans] = now;
return;
}
if (num_four == ) {
dfs(now * + , num_four, num_seven - );
} else if (num_seven == ) {
dfs(now * + , num_four - , num_seven);
} else {
dfs(now * + , num_four - , num_seven);
dfs(now * + , num_four, num_seven - );
}
}
void init() {
for (int i = ; i <= ; i += ) {
dfs(, i / , i / );
}
cout << lenans << endl;
}
void work() {
LL n;
scanf("%I64d", &n);
if (n > ans[lenans]) { //最大值777777777444444444。1e17内的最大值
printf("44444444447777777777\n");
} else {
// LL tans = lower_bound(ans + 1, ans + 1 + lenans);
// printf("%I64d\n", tans);
int begin = , end = lenans;
while (begin <= end) {
int mid = (begin + end) >> ;
if (ans[mid] >= n) {
end = mid - ;
} else begin = mid + ;
}
printf("%I64d\n", ans[begin]);
}
}
int main() {
#ifdef local
freopen("data.txt","r",stdin);
#endif
init();
int t;
scanf("%d", &t);
while (t--) work();
return ;
}
可以学习下DFS的做法
ztr loves lucky numbers 傻逼的我来了个大模拟的更多相关文章
- HDU 5676 ztr loves lucky numbers (模拟)
ztr loves lucky numbers 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/I Description ztr ...
- hdu 5676 ztr loves lucky numbers(dfs+离线)
Problem Description ztr loves lucky numbers. Everybody knows that positive integers are lucky if the ...
- hdu 5676 ztr loves lucky numbers 打表+二分
ztr loves lucky numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- hdu-5676 ztr loves lucky numbers(乱搞题)
题目链接: ztr loves lucky numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- hdu 5676 ztr loves lucky numbers
题目链接:hdu 5676 一开始看题还以为和数位dp相关的,后来才发现是搜索题,我手算了下,所有的super lucky number(也就是只含数字4, 7且4, 7的数量相等的数)加起来也不过几 ...
- hdu5676 ztr loves lucky numbers(dfs)
链接 ztrloveslucky numbers 题意 定义幸运数为:只存在4和7且4和7数量相等的数,给出n,求比>=n的最小幸运数 做法 暴力搜出所有长度从2-18的幸运数,因为最多9个4, ...
- HDU 5676 ztr loves lucky numbers【DFS】
题目链接; http://acm.hdu.edu.cn/showproblem.php?pid=5676 题意: 由4和7组成的且4和7出现次数相同的数称为幸运数字,给定n,求不大于n的最大幸运数字. ...
- hdu_5676_ztr loves lucky numbers
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5676 在这%一下安神,用了我没见过的黑科技next_permutation,至少我是今天才知道的 #i ...
- ztr loves lucky numbers--hdu5676(DFS)
http://acm.hdu.edu.cn/showproblem.php?pid=5676 题目大意: 给你一个数 让你找比这数大并且只含4和7 并且4和7的个数一样 枚举从0到10的18次方之 ...
随机推荐
- CentOS环境 升级Python2.6.6至2.7.5
1.查看当前Python版本 # python -V Python 2.6.6 # python -V Python 2.6.6 2.下载Python2.7.5源码 # wget http://p ...
- oracle下 启动subversion命令 及 oracle相关服务启动备忘
linux shell下 svnserve - d -r + 目录 例如:svnserve -d -r /svn 启动 svn服务. 访问svn://192.168.0.120/kjcg 测试. ...
- 「ZJOI2007」「LuoguP1169」棋盘制作(并查集
题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8×88 \times 88×8大小的黑白相间的方阵,对应八八六十四卦 ...
- bzoj 3781 小B的询问——分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3781 非常经典的分块套路.于是时间空间比大家的莫队差了好多…… #include<io ...
- phpStorm的远端部署
首先远端服务器的路径: /var/www -rwxrwxrwx jiangzhaowei jiangzhaowei 6月 index.html* lr-xr-xr-x root root 2月 php ...
- 将List<T>集合用DataGridView展示
一.若要将List<T>集合的值赋值给DataGridView,首先要DataGridView中的列的DataPropertyName的值要和此集合的T类型的属性字段的名称,类型一致,并且 ...
- 后端开发-Mybatis开发之一
2018-12-29 Mybatis简单开发:我是在eclipse上进行Java项目开发 目录结构如下: 内容如下: mysql.sql: 用于创建测试用的数据库以及表: 可以直接导入mys ...
- 3.4-3.6 Hive Storage Format
一.file format ORCFile在HDP 2:更好的压缩,更好的性能: https://zh.hortonworks.com/blog/orcfile-in-hdp-2-better-com ...
- 【eclipse插件开发实战】 Eclipse插件开发6——eclipse在线翻译插件Translator开发实例详解
Eclipse插件开发6--eclipse在线翻译插件Translator开发实例详解 在上一篇文章中讲到了一个简单的eclipse插件开发实例,主要是对插件工程的基本创建步骤进行了讲解,这篇文章当中 ...
- 多叉树结构:JSON数据解析(一)
多叉树结构:JSON数据解析(一) 最近做一个实时数据搜索引擎的项目中,在项目架构的偏顶层需要写一个JSON数据解析的模块,由于目前JSON解析没有现成统一开源框架可以利用,目前只是手工利用com.a ...