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次方之 ...
随机推荐
- ffmpeg视频格式转换中关键帧的设置
在用ffmpeg转换视频到flv过程中,需要设置关键帧的间隔,以便在播放过程中实现精确定位.在网上查找了不少,最后发现这个指令有效: -g 1 -keyint_min 2 . http://blog. ...
- YCSB-mapkeeper
首先 https://github.com/brianfrankcooper/YCSB/issues/885 最终是使用ycsb-0.1.4 版本进行,这个版本自带jar包 https://githu ...
- jmeter解压后启动jmeter.bat报错:Not able to find java executable or version
错误详情: 错误解决方法: 修改环境变量配置将%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;移动到%SystemRoot%\system32;%SystemRoot%;%Sy ...
- Opencv— — water wave
// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...
- Unable to resolve target 'android-16'
Just now when I imported the "android-support-v7-appcompat" to ADT,the console pointed out ...
- bootstrap 学习笔记(2)---- 排版
安装和栅格系统学完,这篇写的是排版手册中排版的目录如下图 <标题,页面主题,内联文本元素,对齐,改变大小写,缩略语,地址,引用,列表>手册中介绍那么多,其实并不是所有的都要去看看.很多都是 ...
- CodeForces813E:Army Creation (主席树---上一题的加强版)
As you might remember from our previous rounds, Vova really likes computer games. Now he is playing ...
- POJ3728 THE MERCHANT LCA RMQ DP
题意简述:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. ...
- 如何用vs2013开发人员命令提示工具执行一个方法(一个简单的demo)
在任何一个编辑器中编写一个静态的Main方法,必须是静态且名为Main的方法,并将Main方法所在的类文件命名为yang.cs(这个名字随便命名),如图-1. 图-1 打开你的vs2013开发人员命令 ...
- Oracle中CASE WHEN的用法实例
实例演示: (1)查询表users中的数据. select u.id,u.realname,U.SEX from users u; 查询结果如下 ID REALNAME SEX 1 10082 ...