Wannafly模拟赛5 D Aria(全排列)

来源:互联网 发布:linux x264命令 编辑:程序博客网 时间:2024/05/21 13:12

题目链接: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;}
原创粉丝点击