ztr loves lucky numbers

题目链接:

http://acm.hust.edu.cn/vjudge/contest/121332#problem/I

Description

ztr loves lucky numbers. Everybody knows that positive integers are lucky if their decimal representation doesn't contain digits other than 4 and 7. For example, numbers 47, 744, 4 are lucky and 5, 17, 467 are not.

Lucky number is super lucky if it's decimal representation contains equal amount of digits 4 and 7. For example, numbers 47, 7744, 474477 are super lucky and 4, 744, 467 are not.

One day ztr came across a positive integer n. Help him to find the least super lucky number which is not less than n.

Input

There are T cases

For each cases:

The only line contains a positive integer . This number doesn't have leading zeroes.

Output

For each cases

Output the answer

Sample Input

2

4500

47

Sample Output

4747

47

题意:

定义super number:

有且仅有4和7两个数字,且两个数字出现的次数相同.

给出n,求最小的不小于n的super number

题解:

xjb打了一通大模拟,结果越打越觉得坑;

还好分清细节后过掉了;

模拟思路:考虑当前数位能是否能放4或7(用strcmp比较后续数);

当两数大小确定后,后面的序列应按最小顺序编排;

另解:

  1. 直接打表然后二分.
  2. 用next_permutation获取可能的组合再比较.

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#define LL long long
#define eps 1e-8
#define maxn 3100
#define inf 0x3f3f3f3f
#define IN freopen("in.txt","r",stdin);
using namespace std; char num[25];
int cnt; int main(int argc, char const *argv[])
{
//IN;
//freopen("out.txt","w",stdout); // printf("%d\n", 1000000);
// for(int i=1; i<=1000000; i++)
// printf("%d\n", i); int t; cin >> t; getchar();
//int t = 0;
while(t--)
{
LL n=0,cmps=0;
char c;
cnt = 0;
memset(num,0,sizeof(num));
gets(num); for(int i=0; i<strlen(num); i++) {
if(num[i]<'0' || num[i]>'9') break;
cnt++;
n = n*10 + num[i] - '0';
}
num[cnt] = 0; if(cnt&1) {
for(int i=1; i<=(cnt+1)/2; i++) printf("4");
for(int i=1; i<=(cnt+1)/2; i++) printf("7");
printf("\n");
continue;
} for(int i=1; i<=cnt/2; i++) cmps = cmps*10 + 7;
for(int i=1; i<=cnt/2; i++) cmps = cmps*10 + 4; if(cmps < n) {
for(int i=1; i<=(cnt+2)/2; i++) printf("4");
for(int i=1; i<=(cnt+2)/2; i++) printf("7");
printf("\n");
continue;
} char ans[25] = {0};
int si=cnt/2,qi=cnt/2;
for(int i=0; i<cnt; i++) {
if(num[i]<'4') {
if(si) ans[i] = '4', si--;
else ans[i] = '7', qi--;
for(int j=0; j<=i; j++) printf("%c", ans[j]);
while(si--) printf("4");
while(qi--) printf("7");
printf("\n");
break;
}
if(num[i] == '4') {
char tmp[25] = {0};
for(int j=0; j<qi; j++) tmp[j] = '7';
for(int j=qi; j<qi+si-1; j++) tmp[j] = '4';
if(!si || strcmp(tmp,num+i+1) < 0) {
ans[i] = '7'; qi--;
for(int j=0; j<=i; j++) printf("%c", ans[j]);
while(si--) printf("4");
while(qi--) printf("7");
printf("\n");
break;
}
if(strcmp(tmp,num+i+1) == 0) {
ans[i] = '4'; si--;
for(int j=0; j<=i; j++) printf("%c", ans[j]);
printf("%s",tmp);
printf("\n");
break;
}
ans[i] = '4'; si--;
continue;
}
if(num[i] == '7') {
char tmp[25] = {0};
for(int j=0; j<qi-1; j++) tmp[j] = '7';
for(int j=qi-1; j<qi+si-1; j++) tmp[j] = '4';
if(!qi || strcmp(tmp,num+i+1) < 0) {
for(int i=1; i<=(cnt+2)/2; i++) printf("4");
for(int i=1; i<=(cnt+2)/2; i++) printf("7");
printf("\n");
break;
}
if(strcmp(tmp,num+i+1) == 0) {
ans[i] = '7'; qi--;
for(int j=0; j<=i; j++) printf("%c", ans[j]);
printf("%s",tmp);
printf("\n");
break;
}
ans[i] = '7'; qi--;
continue;
} ans[i] = '7'; qi--;
for(int j=0; j<=i; j++)
printf("%c", ans[j]);
while(si--) printf("4");
while(qi--) printf("7");
printf("\n");
break;
} //printf("\n");
} return 0;
}

HDU 5676 ztr loves lucky numbers (模拟)的更多相关文章

  1. hdu 5676 ztr loves lucky numbers(dfs+离线)

    Problem Description ztr loves lucky numbers. Everybody knows that positive integers are lucky if the ...

  2. hdu 5676 ztr loves lucky numbers 打表+二分

    ztr loves lucky numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  3. hdu 5676 ztr loves lucky numbers

    题目链接:hdu 5676 一开始看题还以为和数位dp相关的,后来才发现是搜索题,我手算了下,所有的super lucky number(也就是只含数字4, 7且4, 7的数量相等的数)加起来也不过几 ...

  4. HDU 5676 ztr loves lucky numbers【DFS】

    题目链接; http://acm.hdu.edu.cn/showproblem.php?pid=5676 题意: 由4和7组成的且4和7出现次数相同的数称为幸运数字,给定n,求不大于n的最大幸运数字. ...

  5. hdu-5676 ztr loves lucky numbers(乱搞题)

    题目链接: ztr loves lucky numbers  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 65536/65536 K ( ...

  6. ztr loves lucky numbers 傻逼的我来了个大模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=5676 这题的正解因该是dfs的,但是有18个位,然后我一算,全排列的话,有18!个啊,那不是很大?但是有很多是相 ...

  7. hdu5676 ztr loves lucky numbers(dfs)

    链接 ztrloveslucky numbers 题意 定义幸运数为:只存在4和7且4和7数量相等的数,给出n,求比>=n的最小幸运数 做法 暴力搜出所有长度从2-18的幸运数,因为最多9个4, ...

  8. HDU 5677 ztr loves substring(Manacher+dp+二进制分解)

    题目链接:HDU 5677 ztr loves substring 题意:有n个字符串,任选k个回文子串,问其长度之和能否等于L. 题解:用manacher算法求出所有回文子串的长度,并记录各长度回文 ...

  9. HDU 5675 ztr loves math (数学推导)

    ztr loves math 题目链接: http://acm.hust.edu.cn/vjudge/contest/123316#problem/A Description ztr loves re ...

随机推荐

  1. Control Flow in Async Programs

    Control Flow in Async Programs You can write and maintain asynchronous programs more easily by using ...

  2. Android开发之LocationManager和定位

    代码: /* * 获取当前的位置,并通过短信发送位置到指定号码 */ public class LocationService extends Service { private LocationMa ...

  3. git push提示或错误

    当 git 和 gerrit 一起使用的时候,你创建了一个 tag,现在需要 push 到远程仓库,当你没有权限的时候,会出现如下提示: $ git push origin v20150203 Tot ...

  4. hdu3037 Lucas定理

    Lucas定理 Lucas(n,m,p)=c(n%p,m%p)* Lucas(n/p,m/p,p),其中lucas(n,m,p)=C(n,m)%p (这里的除号是整除) 证明——百度百科 题意:求n个 ...

  5. Qt之进程间通信(TCP/IP)

    简述 可以通过Qt提供的IPC使用TCP/IP,使用QtNetwork模块即可实现,TCP/IP在实现应用程序和进程内部通信或与远程进程间的通信方面非常有用. QtNetwork模块提供的类能够创建基 ...

  6. HDU 3746 (KMP求最小循环节) Cyclic Nacklace

    题意: 给出一个字符串,要求在后面添加最少的字符是的新串是循环的,且至少有两个循环节.输出最少需要添加字符的个数. 分析: 假设所给字符串为p[0...l-1],其长度为l 有这样一个结论: 这个串的 ...

  7. 深入理解移动web开发之PPI,Pixel,DevicePixelRatio(转)

    如果你是一个开始接触移动Web开发的前端工程师,那么你或许也遇到了和我曾经遇到的过问题:有太多新的概念需要掌握,太多相似的概念需要区分.没关系,我将用两篇文章的篇幅来解决这些问题.上篇文章关于解释和区 ...

  8. vc2005编译ffmpeg以及ffplay

    ffmpeg编译过程:1 http://ffmpeg.zeranoe.com/builds/下载官方提供的源码,win32库和dll.2 新建vc2005 console空工程,把ffmpeg.h,f ...

  9. B树索引和位图索引的区别!

    B树索引主键和唯一性约束字段的B树索引,效率几乎和海量数据没有关系. 键值重复率低的字段比较适合使用B树索引. 位图索引键值重复率高的字段比较适合使用位图索引.count.and.or.in这些特定的 ...

  10. db2数据库Date相关函数

    1.db2可以通过SYSIBM.SYSDUMMY1.SYSIBM.DUAL获取寄存器中的值,也可以通过VALUES关键字获取寄存器中的值. SELECT 'HELLO DB2' FROM SYSIBM ...