題目鏈接:https://www.nowcoder.com/acm/contest/18/D
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld
題目描述
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。
解析:本來可以過的題,由於自己太懶,直接百度了一個全排列的板子,這個板子是錯的,害的我簽到題都沒過,一直WA,通過率80%,第二天上午補題時發現全排列公式錯了,好氣啊
代碼:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int a[11];
int f, ans;
queue<int> s[2];
void dfs(int l, int r)
{
if(l == r)
{
int k = 0;
for(int i = 0; i < r; i++) k = k*10+a[i];
ans = max(ans, k);
s[!f].push(k);
//cout << k << endl;
return ;
}
for(int i = l; i < r; i++)
{
swap(a[l], a[i]);
dfs(l+1, r);
swap(a[l], a[i]);
}
}
int main()
{
int n, x;
scanf("%d", &n);
f = 0;
s[0].push(0);
ans = 0;
for(int i = 1; i <= n; i++)
{
scanf("%d", &x);
while(!s[f].empty())
{
int sum = s[f].front(); s[f].pop();
sum += x;
int len = 0;
while(sum)
{
a[len++] = sum % 10;
sum /= 10;
}
dfs(0, len);
}
f = !f;
}
printf("%d\n", ans);
return 0;
}