码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-04-30 22:06:00      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

ztr loves lucky numbers

 Time Limit: 2000/1000 MS (Java/Others)
 Memory Limit: 65536/65536 K (Java/Others)
问题描述
ztr喜欢幸运数字,他对于幸运数字有两个要求
1:十进制表示法下只包含4、7
2:十进制表示法下4和7的数量相等
比如47,474477就是
而4,744,467则不是

现在ztr想知道最小的但不小于n的幸运数字是多少
输入描述
TT(1T10?5??)组数据,每组数据一个正整数n,n<=10^18}1n10?^18??
输出描述
TT行,每行即答案
输入样例
2
4500
47
输出样例
4747
47


题意

思路

分情况讨论呗,d个毛线dfs,还二分,贪心就能搞定;比赛的时候数据出了0,最后也没改过来,哎,BC确实没有CF做的好;

AC代码

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N=1e5+6;
const LL mod=1e9+7;
const double PI=acos(-1.0);
int a[30],b[30];
int check(int x)
{
    for(int i=0;i<x/2;i++)
    {
        if(b[i]<7)return 1;
        else if(b[i]>7)return 0;
        else
        {
            continue;
        }
    }
    for(int i=x/2;i<x;i++)
    {
        if(b[i]<4)return 1;
        else if(b[i]>4)return 0;
        else continue;
    }
    return 1;
}
int main()
{
    int t;
    scanf("%d",&t);
    LL n;
    while(t--)
    {
        scanf("%I64d",&n);
        LL m=n;
        int cnt=0,num=0;
        while(m)
        {
            a[cnt++]=m%10;
            m/=10;
        }
        for(int i=cnt-1;i>=0;i--)
        {
            b[num++]=a[i];
        }
        if(n<=0)printf("47");
        else {
        if(num%2==1)
        {
               num++;
                int flag1=num/2;
                for(int i=1;i<=flag1;i++)
                {
                    printf("4");
                }
                for(int i=1;i<=flag1;i++)
                {
                    printf("7");
                }
        }
        else
        {
            if(check(num)==0)
            {
                num+=2;
                for(int i=0;i<num/2;i++)
                {
                    printf("4");
                }
                for(int i=0;i<num/2;i++)
                {
                    printf("7");
                }
            }
            else
            {
                int vis1=num/2,vis2=num/2;
                for(int i=0;i<num;i++)
                {
                    if(b[i]>4&&b[i]<7)
                    {
                        printf("7");
                        vis2--;
                        for(int j=0;j<vis1;j++)  printf("4");
                        for(int j=0;j<vis2;j++)  printf("7");
                        break;
                    }
                    else if(b[i]==7)
                    {
                        printf("7");
                        vis2--;
                    }
                    else if(b[i]<4)
                    {
                        if(vis1)
                        {
                            printf("4");
                            vis1--;
                            for(int j=0;j<vis1;j++)printf("4");
                            for(int j=0;j<vis2;j++)printf("7");
                            break;
                        }
                        else
                        {
                            for(int j=0;j<vis2;j++)printf("7");
                            break;
                        }
                    }
                    else
                    {
                        LL ans1=0,ans2=0;
                        for(int j=0;j<vis2;j++)
                        {
                            ans1=ans1*10+7;
                        }
                        for(int j=0;j<vis1-1;j++)
                        {
                            ans1=ans1*10+4;
                        }
                        for(int j=i+1;j<num;j++)
                        {
                            ans2=ans2*10+b[j];
                        }
                        if(ans2<=ans1&&vis1)
                        {

                            printf("4");
                            vis1--;
                        }
                        else
                        {
                           // cout<<"@"<<endl;
                            //cout<<vis1<<" "<<vis2<<"#"<<endl;
                            printf("7");
                            vis2--;
                            for(int j=0;j<vis1;j++)
                            {
                                printf("4");
                            }
                            for(int j=0;j<vis2;j++)
                            {
                                printf("7");
                            }
                            break;
                        }
                    }

                }

            }

        }
        }
printf("\n");
    }
    return 0;
}

 

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

标签:

原文地址:http://www.cnblogs.com/zhangchengc919/p/5449525.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!