2023首届大学生算法大赛 - 帮助小强

 


这道题和幸运数字差不多,也是一个深搜就解决了。

每个能放加号的位置都有两种状态:1、放加号    2、不放加号

N<=10^15,故能放加号的位置最多14个,复杂度为2^14=16384。

易得解空间树,根据树写出递归代码。

 

AC代码

#include <bits/stdc++.h>
#define int long long
using namespace std;

int n,ans,nl,t;
bool flag[20];
int get(int l,int r){
    int res=n/pow(10,nl-r);
    int k= pow(10,r-l+1);
    return res%k;
}
void dfs(int i){
    if(i==nl+1){
        int pos=1,res=0;
        flag[nl]=true;
        for(int j=1;j<=nl;++j)
            if(flag[j]){
                res+= get(pos,j);
                pos=j+1;
            }
        ans+=res;
        return;
    }

    flag[i+1]=true;
    dfs(i+1);
    flag[i+1]=false;
    dfs(i+1);
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    cin>>n;
    t=n;
    while(t){
        nl++;
        t/=10;
    }

    dfs(0);
    cout<<ans/4;
    return 0;
}

代码中有几处关键的地方。

1、get函数,假如有数字5892,那么get(1,3)=589,get(2,3)=89。根据下标拿出部分,方便累加。

2、以打标记的方法实现加号插空,如果flag[1]=true,那么[1,1]要变成子部分累加。因为加过了,所以下一个pos从2开始,即i+1。如果下一个flag[4]=true,就能累计[2,4]子部分。

3、因为采用的是尾部判定实现加上子部分,不难发现如果循环到最后一位不是true,那就不会加上,所以开头要flag[nl]=true。

4、由于深搜代码复杂度很低,所以没有优化,导致每种情况都会加上4次,所以输出要除以4。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自从2010年首届山东省大学生软件设计大赛成功举办以来,已经走过了十年的时间。在这十年里,大赛不断创新,不断发展,成为了山东省大学生中颇具影响力的赛事之一。 大赛的初衷是为了促进大学生对软件设计的学习和研究,提高他们的实践能力和综合素质。在比赛中,参赛选手需要独立完成一个软件项目的设计和实现,并展示出自己的创新和才华。这不仅要求选手具备扎实的理论知识和技术能力,还需要他们具备良好的团队协作能力和创新意识。 十年来,大赛举办地点不断扩大,赛事规模不断壮大,参赛选手数量也逐年增加。同时,大赛的主题也不断变化,从最初的“互联网+”到现在的“智能化”,贴近时代发展,关注社会热点。参赛作品也从最初的简单应用程序,逐渐扩展到了各个领域的软件设计,如智能家居、虚拟现实、人工智能等。 十年来,大赛不仅为广大大学生提供了一个展示自己才华的平台,还为企业提供了一个挖掘人才的渠道。许多优秀的参赛作品得到了企业的关注和认可,有的作品甚至得到了企业的扶持和支持,成为了真正的商业产品。 在未来的十年里,山东省大学生软件设计大赛将继续发扬创新精神,关注时代发展,推动软件设计教育的发展,为大学生提供更多展示才华的机会。同时,也将为企业提供更多挖掘人才的机会,促进产学研紧密结合,共同推动社会的发展和进步。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值