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;
}