题目
链接:https://ac.nowcoder.com/acm/contest/46814/C
来源:牛客网
阿宁有n个的背包,大小分别是从1到n。
现在阿宁要将这n个背包合成一个大背包。
首先阿宁将这n个背包排成一行。
每一轮合成,从相邻的两个背包得到一个新的背包,大小为两个背包的大小之和,旧背包消失。
合成n−1轮,得到一个大背包。
例如:
初始有4个背包,顺序为[1,4,3,2]。
第一轮:[5,7,5]。
第二轮:[12,12]。
第三轮:[24]。
4个背包得到一个大小为24的背包。
现在阿宁想知道他的n个背包,初始的顺序是什么,才能获得最大的背包?
输入描述:
第一行一个整数n。
1≤n≤pow(10,3)
输出描述:
第一行输出一个非负整数,表示最终的背包大小。
第二行输出n个整数,表示初始n个背包的顺序。
对于背包的大小,答案可能太大,请对pow(10,9)+7取模再输出。
背包的顺序可能有多种,输出任意一解即可。
Example
input
4
output
24
1 4 3 2
解题思路
小的数靠两边,越大的数放中间
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n;
cin >> n;
ll a[1100];
ll b[1100];
ll j=0;
for(ll i=0;i<n;i++)
{
if(i%2==0)
{
a[j++]=i+1;
}
else
{
a[n-j]=i+1;
}
}
for(ll i=0;i<n;i++)
{
b[i]=a[i];//复制数组
}
ll num1=n;
for(ll i=0;i<n;i++)
{
for(ll j=0;j<n-i-1;j++)
{
b[j]=b[j]+b[j+1];
b[j]%=1000000007;
}
}
cout << b[0] << '\n';
for(ll i=0;i<num1;i++)
{
cout << a[i] << ' ';
}
return 0;
}
反思
没能想到如何写出数组
没能想到如何逐项相加
取模是%
未能看清条件1<=n<=1000,误以为是100