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. Android的底层库libutils介绍

    第一部分 libutils概述 libutils是Android的底层库,这个库以C++实现,它提供的API也是C++的.Android的层次的C语言程序和库,大都基于libutils开发. libu ...

  2. java开发之匿名内部类,接口的使用

    下面的例子是Java.JDK7学习笔记上的 打算开发多人联机程序,对每个联机客户端,都会建立Client对象封装相关信息 1.Client.java public class Client { pri ...

  3. 如何在Ubuntu上安装最新版本的Node.js

    apt-get update apt-get install -y python-software-properties software-properties-common add-apt-repo ...

  4. sdut 2840 Best string Orz~ (dp)

    题目 题意:有n1个o, n2个r, n3个z, n4个~, 求有多少种组合使 组合出来的字符串的任意前缀都满足 o的个数>=r的个数, r的个数>=z的个数 …………………… 思路:递推 ...

  5. java--关键字和保留字

    关键字:Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等. 保留字:为java预留的关键字.现在还没用到,但是在升级版本中可能作为关键字. 访问控制:pr ...

  6. ASP.NET MVC Html.BeginForm用法1

    Html.BeginForm():该方法用于构建一个From表单的开始, 他的构造方法为:Html.BeginForm("ActionName","ControllerN ...

  7. Java [Leetcode 67]Add Binary

    题目描述: Given two binary strings, return their sum (also a binary string). For example,a = "11&qu ...

  8. RegExp类型和text()方法

    ECMAScript通过RegExp类型来支持正则表达式 RegExp 实例方法:text() 它接受一个字符串参数,在模式与该参数匹配的情况下返回true,否则返回false,通常用在if语句中 / ...

  9. POJ 2253 Difference of Clustering

    题意:给出一堆点,求从起点到终点的所有通路中相邻点的距离的最大值的最小值.(意思就是自己百度吧……) 解法:用相邻点的最大值作为权值代替路径的距离跑最短路或者最小生成树.然后我写了一个我以为是优化过的 ...

  10. 怎样在 Ubuntu 中修改默认程序

    导读 作为一个新手,你需要知道如何在 Ubuntu 中修改任何默认程序,这也是我今天在这篇指南中所要讲的. 对于我来说,安装 VLC 多媒体播放器是安装完 Ubuntu 16.04 该做的事中最先做的 ...