专栏文章

题解:P13929 [蓝桥杯 2022 省 Java B] 山

P13929题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@mio17gof
此快照首次捕获于
2025/12/02 11:41
3 个月前
此快照最后确认于
2025/12/02 11:41
3 个月前
查看原文
搜索题。
数据范围很小,所以直接爆搜。我们首先生成一个单调不减序列作为山的前半部分,通过反转这个序列得到山的后半部分,组合成完整的山。
如果回文数长度为偶数,直接将前半部分和后半部分拼起来即可。
否则,我们省掉后半部分的第一个字符,再将两半拼起来即可。
代码如下。注意检查生成的山的合法性。
CPP
#include<bits/stdc++.h>
using namespace std;
using ull=unsigned long long;
ull ans;
const ull L=2022,R=2022222022;
int n;
int a[15];
void dfs(int pos,int last,int len,bool odd){
    if(pos==len){
        string s;
        for(int i=0;i<len;i++)s.push_back('0'+a[i]);
        int j=len-1-(odd?1:0);
        for(;j>=0;j--)s.push_back('0'+a[j]);
        if(s[0]=='0')return;
        ull x=0;
        for(char c:s)x=x*10+(c-'0');
        if(x>=L&&x<=R)ans++;
        return;
    }
    for(int d=last;d<=9;d++){
        a[pos]=d;
        dfs(pos+1,d,len,odd);
    }
}
int main(){
    for(int len=2;len<=5;len++){
        dfs(0,0,len,false);
        dfs(0,0,len,true);
    }
    cout<<ans;
}
当然,这是一道结果填空题,所以本题的正确答案是 31383138,也就是上面的代码跑出来的结果。

评论

1 条评论,欢迎与作者交流。

正在加载评论...