D-Aria

题目描述
Aria是一名武侦高强袭科的学生,由于悬殊的实力差距,没有人可以
与她配合。所以正如她的名字一样(aria在歌剧中有独唱曲之意),Aria一直都是孤身一人。
Aria在无聊的时候会玩一种特殊的加法游戏,这个游戏是这样的:
∙ 给出n个数ai,起初sum = 0。
∙ 把这n个数按1 ~n的顺序依次加入,即在第i步时sum = sum + ai。
∙ 每加入一个数后,可以把sum 十进制按位拆开后随意重排,得到一个
新的数。重排允许前导0的出现,比如10可以重排成1或10。
但一直玩这个游戏只会觉得越来越无聊,所以Aria想知道最后能得到
的最大的sum 是多少。
输入描述:
第一行,一个正整数n。
第二行,n个正整数ai。
输出描述:
一行,一个正整数,即最大的sum 。
示例1
输入

5
42 1 3 3 6
输出

100
说明

∙ 0+42=42
∙ 42+1=43
∙ 43+3=46
∙ 46+3=49→94
∙ 94+6=100
备注:
对于20%的数据,n = 1。
对于30%的数据,n ≤ 2。
对于40%的数据,n ≤ 3。
对于50%的数据,n ≤ 4。
对于另20%的数据,sum ≤ 1000。
对于100%的数据,n ≤ 5,1 ≤ai ≤ 100。


讲真,这是第一次在牛客网做题,也是写了一道陌生的dfs水题,就是拼命搜索,看着数据量就是暴力。多写搜索代码,注意搜索时数值数组的变化。上代码吧。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,ans=0;
void dfs(int step,int sum)
{
    if(step==n)
    {
        ans=max(ans,sum);
        return;
    }
    sum+=a[step];
    int m=0;
    int b[10];     //b数组硬是要放在里面;
    while(sum)
    {
       b[m++]=sum%10;
       sum/=10;
    }
    sort(b,b+m);
    do
    {
        int total=0;
        for(int i=0;i<m;i++)
            total=total*10+b[i];
        dfs(step+1,total);
    }while(next_permutation(b,b+m));

}
int main()
{
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
            cin>>a[i];
        dfs(0,0);
        cout<<ans<<endl;

    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值