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次方之 ...
随机推荐
- HTML预览 正则替换
1. [代码][PHP]代码 <?php if(!defined('BASEPATH')) exit('No direct script access allowed'); /** ...
- linux系统CentOS6.5下tokudb数据库引擎的安装
tokuDB是一个关于mysql数据引擎的开源项目,官网对其特点的描述主要有三点: 1.高压缩比,官方宣称可以达到1:12. 2.高insert性能,官方称至少比innodb高9倍. 3.可以在线添加 ...
- cygwin Could not create directory '/home/Administrator/.ssh'
在cygwin下运行: ssh-keygen -C "634772208@qq.com" -t rsa 时,出现如下错误: cygwin Could not create dire ...
- 让人头疼一晚上的 select 下拉框赋值问题
一开始做这个功能 批量修改用户组 , 当勾选若干用户组后, 点击[批量修改用户组]->ajax提交后台查询->返回下拉菜单列表内容-> 弹出对话框并赋予下拉菜单select 动态数值 ...
- sparkContext之一:sparkContext的初始化分析
Spark源码学习:sparkContext的初始化分析 spark可以运行在本地模式local下,可以运行在yarn和standalone模式下,但是本地程序是通过什么渠道和这些集群交互的呢?那就是 ...
- hdu5530
分治ntt 考虑从添加i,放在j位置,那么1->j是一个连通块,j+1->i和1->j不连通,那么我们可以列出式子dp[i]=∑j=1->i dp[i-j]*A(i-1,j-1 ...
- 二、mysql安装详解
step1:打开下载的mysql安装文件(mysql-5.5.36-win32.msi),双击运行,如下图: step2:点击“Next”按钮继续,如下图: step3:点击“勾选”,点击“Next” ...
- HUD-1548
A strange lift Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- apk重签名的两种方法
因为robotium要求被测应用和测试代码要有一致的签名, 所以需要将apk包重签名. 方法一:通过re-sign.jar来产生debug key的apk(不适用于jdk 7以上) re-sign.j ...
- dataTables使用ajax请求显示数据
dataTables是一种很好用前端表格显示库.当加载大量数据时,可以用Ajax 获取数据来提高效率,增速网页加载速率.下面以一个例子作示范. 首先,需要下载jQuery以及dataTables库.这 ...