牛客练习赛71——回文数(模拟+细节)

简介: 牛客练习赛71——回文数(模拟+细节)

牛客练习赛71——回文数(模拟+细节)


真的细节。


原题链接


思路:


记每一位的个数为num[i].根据题意可以得知:


无法构造的情况有:


1.有至少两个num[i]为奇数。


2.num[0]>=2并且其他数位只有一个并且只出现了一次,比如050,就无法避免前导0


注意特判最后一个样例。


正常做法分为两类,如果num[0]==0,说明无需考虑前导零的问题,直接从小到大枚举取一半构造出前半段,翻转得到后半段即可;否则,就要先把最小的非0位放在开始,然后再重复前面的步骤。如果num[i]%2的话,就将多出来的这个放在中间。


附上垃圾代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll>PLL;
typedef pair<int,int>PII;
typedef pair<double,double>PDD;
#define I_int ll
inline ll read()
{
    ll x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
char F[200];
inline void out(I_int x)
{
    if (x == 0)
        return (void) (putchar('0'));
    I_int tmp = x > 0 ? x : -x;
    if (x < 0)
        putchar('-');
    int cnt = 0;
    while (tmp > 0)
    {
        F[cnt++] = tmp % 10 + '0';
        tmp /= 10;
    }
    while (cnt > 0)
        putchar(F[--cnt]);
    //cout<<" ";
}
ll ksm(ll a,ll b,ll p)
{
    ll res=1;
    while(b)
    {
        if(b&1)
            res=res*a%p;
        a=a*a%p;
        b>>=1;
    }
    return res;
}
const ll inf = 0x3f3f3f3f3f3f3f3f;
const int N=410,mod=1e8;
const double PI = 3.1415926535;
const double eps=1e-6;
const int maxn=1100;
int main()
{
    int num[10];
    int cnt=0,sum=0,pos;
    for(int i=0; i<=9; i++)
    {
        num[i]=read();
        if(num[i]&1)
            cnt++,pos=i;
        if(num[i]) sum++;
    }
    if(cnt>1||(num[0]>=2&&sum==2&&num[pos]==1))
        puts("-1");
    else if(sum==1&&num[0]==1) puts("0");
    else
    {
        if(num[0]==0)
        {
            string s;
            int flag=-1;
            for(int i=0; i<=9; i++)
                if(num[i])
                {
                    for(int j=1; j<=num[i]/2; j++)
                    {
                        char t=i+'0';
                        s=s+t;
                    }
                    if(num[i]&1)
                        flag=i;
                }
            cout<<s;
            if(flag!=-1)
                cout<<flag;
            reverse(s.begin(),s.end());
            cout<<s<<endl;
        }
        else
        {
            string s;
            int pos=1;
            while(!num[pos]) pos++;
            char ch=pos+'0';
            s+=ch;
            num[pos]-=2;
            int flag=-1;
            for(int i=0; i<=9; i++)
                if(num[i])
                {
                    for(int j=1; j<=num[i]/2; j++)
                    {
                        char t=i+'0';
                        s=s+t;
                    }
                    if(num[i]&1)
                        flag=i;
                }
            cout<<s;
            if(flag!=-1)
                cout<<flag;
            reverse(s.begin(),s.end());
            cout<<s<<endl;
        }
    }
    return 0;
}


目录
相关文章
|
6天前
|
存储 算法 数据挖掘
力扣174题动态规划:地下城游戏(含模拟面试)
力扣174题动态规划:地下城游戏(含模拟面试)
|
23天前
|
C语言
青蛙跳台阶:我如何得知它是一道斐波那契数列题?——应用题破题“三板斧”(一)
这篇内容介绍了C语言学习中的经典例题——斐波那契数列,强调了解题思路的重要性。斐波那契数列是一个数列,其中每个数是前两个数的和。文章指出,很多类似题目,如“青蛙跳台阶”,实质上都在考察斐波那契数列的实现。文中提供了斐波那契数列的定义、代码实现和递归与非递归的思路,并鼓励读者从问题中分析出解题模型,而非直接套用已知方法。此外,还提及了一道相关题目“矩形覆盖问题”,以供进一步练习。
17 0
|
23天前
|
机器学习/深度学习 算法 测试技术
青蛙跳台阶:我如何得知它是一道斐波那契数列题?——应用题破题“三板斧”(二)
这篇内容是关于解题策略的,主要介绍了在面对应用题时可以采用的“三板斧”方法:举例、模拟和找规律。通过一个走楼梯的例子详细解释了这三个步骤如何运用。首先,举例将抽象问题具体化,比如走5级台阶有几种方式。其次,通过模拟不同情况,例如思考走每一步的可能,发现递归或循环的模式。最后,通过找规律归纳出一般性的解决方案,这里发现走台阶问题与斐波那契数列相关。文章还提到了一个拓展案例——矩形覆盖问题,同样可以用类似的方法分析。总的来说,文章强调了解题过程中理解和转化问题的重要性,以及通过训练提升这方面能力。
19 0
|
25天前
【错题集-编程题】大数乘法(模拟 + 高精度乘法)
【错题集-编程题】大数乘法(模拟 + 高精度乘法)
|
1月前
|
机器学习/深度学习
蓝桥杯-2/14天-完全平方数【另类思路】
蓝桥杯-2/14天-完全平方数【另类思路】
|
7月前
|
算法 测试技术 容器
代码随想录算法训练营第四十二天 | LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零
代码随想录算法训练营第四十二天 | LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零
30 1
|
7月前
|
算法
代码随想录算法训练营第二十四天 | LeetCode 77.组合
代码随想录算法训练营第二十四天 | LeetCode 77.组合
70 0
|
10月前
|
算法
[算法刷题题解笔记] 洛谷 P1008 [NOIP1998 普及组] 三连击 [枚举|模拟]
[算法刷题题解笔记] 洛谷 P1008 [NOIP1998 普及组] 三连击 [枚举|模拟]
|
12月前
|
机器学习/深度学习 算法 Java
代码随想录训练营day43| 1049. 最后一块石头的重量 II 494. 目标和 474.一和零...
代码随想录训练营day43| 1049. 最后一块石头的重量 II 494. 目标和 474.一和零...
|
算法 C++
【每日算法Day 70】图解算法:小学生都会的数块数问题,你会吗?
【每日算法Day 70】图解算法:小学生都会的数块数问题,你会吗?

热门文章

最新文章