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%,第二天上午补题时发现全排列公式错了,好气啊
代码:
时间限制: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; }
相关文章推荐
- Wannafly模拟赛5 D Aria
- 牛客网 Wannafly模拟赛 矩阵 二分+hash矩阵
- Wannafly模拟赛3-B 贝伦卡斯泰露(DFS)
- Wannafly模拟赛4 B.Distance 最大曼哈顿距离
- Wannafly模拟赛5 A split 二分
- Wannafly 模拟赛A Laptop 树状数组
- Wannafly模拟赛 树【思维+Dp】
- Wannafly模拟赛3 题解
- Wannafly模拟赛4 B.Distance 最大曼哈顿距离
- Wannafly模拟赛4 B.Distance 最大曼哈顿距离
- Wannafly模拟赛3
- Wannafly模拟赛 A.矩阵(二分答案+hash)
- Wannafly模拟赛2 B river(拉格朗日乘数法)
- Wannafly模拟赛3 生物课程
- Wannafly模拟赛4 B.Distance 最大曼哈顿距离
- Wannafly模拟赛 矩阵 [矩阵hash+二分]
- Wannafly模拟赛3 贝伦卡斯泰露 【折半搜索+hash,状压dp】
- Wannafly模拟赛4 B.Distance 最大曼哈顿距离
- Wannafly模拟赛4 A 题 Laptop 【二维偏序问题 + 树状数组维护】
- Wannafly模拟赛3 贝伦卡斯泰露(搜索+剪枝)