Wannafly模擬賽5 D Aria(全排列)

題目鏈接: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章