您的位置:首页 > 其它

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

2017-11-05 17:02 197 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: