题目描述
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;
}