fjnuoj1199 火柴棒 贪心

Flag巨巨的桌上有着非常多的火柴棒。这些火柴棒被摆成了一个十进制数。

每个数字字母用火柴棒的摆法如下图。



这个十进制数有n位。某一天,Flag巨巨想把这些火车棒重新排列一次。他喜欢美妙的数字,所以他希望排出的新的数字是一个回文数(如12321,1221都是回文数,1231则不是回文数),并且要恰好用完所有的火柴棒。同时他也喜欢大的数字,所以他希望排出来的新数字要尽量大。现在我们知道火柴棒原本排列的数字,你能求出这些火柴棒能排列出的最大的回文数是什么吗?


Input

第一行给定一个整数T,代表测试数据组数
之后T行每行给定一个n位十进制数(1<=n<=10000),表示火柴棒原本排列的数字。

Output

根据输入数据,每行输出一个十进制数,表示这些火柴棒能排列出的最大的回文数。

Sample Input

3248

Sample Output

511171

HINT

每一个数字所需要的火柴棒数量与题目中的图相符。

对于样例输入,原本排列的数是‘2’,总共有5根火柴棒,可以排列出的最大的回文数为5。

Source



居然还是新生赛。。。。再一次认识到自己的弱小。。。。。

我感觉这题坑点挺多的。。。果然是自己一开始就想错的原因吗。。。

q巨还是1A,强啊。。。

首先,想要数字大的话,有一句真理,长才是王道!!

于是就拿费火柴棍最少的1(耗费两根火柴棍)来凑,尽量凑长一点。

如果火柴棍的总数是偶数就无需考虑了,直接输出ans/2个1吧

如果是奇数个的话,我们就要分两种情况考虑,一个是ans里的摆1(耗费火柴棍2根)的对数是奇数个,或者是偶数个

对于奇数个的1火柴对,很好解决,在中间的两根火柴棍上添上一根变成7就是回文串了

而偶数比较麻烦,要总共拿九根火柴来凑出三个7,然后让两个七分布在头尾,一个七放在中间才可以。。。

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>
using namespace std;
int region[10] = {6,2,5,5,4,5,6,3,7,6};
char res[110];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int i,j;
        string n;
        cin>>n;
        //cout<<"n is "<<n<<endl;
        int ans = 0,a;
        int len = n.length();
        
        for(i=0;i<len;i++){
            a = n[i] - '0';
            //cout<<a<<endl;
            ans += region[a];
        }
        if(ans==9){
            printf("777\n");
            continue;
        }
        //cout<<"ans "<<ans<<endl;
            if(ans==5){
                printf("5\n");
                continue;
            }
        
        if(ans%2==0){
            for(i=1;i<=ans/2;i++){
                printf("1");
            }
            printf("\n");
            continue;
        }else{
            if((ans/2)%2==1){
                for(i=1;i<=(ans-3)/4;i++){
                    printf("1");
                }
                printf("7");
                for(i=1;i<=(ans-3)/4;i++){
                    printf("1");
                }
            }else{
                printf("7");
                for(i=1;i<=(ans-9)/4;i++){
                    printf("1");
                }
                printf("7");
                for(i=1;i<=(ans-9)/4;i++){
                    printf("1");
                }
                printf("7\n");
                continue;
            }
            printf("\n");
            continue;
        }
    }
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值