-
描述
-
小明和小红在打赌说自己数学学的好,于是小花就给他们出题了,考考他们谁NB,题目是这样的给你N个数在这n个数之间添加N-1个*或+,使结果最大,但不可以打乱原顺序,请得出这个结果如1 3 5结果是(1+3)*5=20;最大可以添加若干个括号,但一定要保证配对,但是每两个数之间只可能有一个*或+数列最前和最后不应有+或乘小明想赢小红但是他比较笨,请你帮帮他
-
输入
- 多组测试数据以EOF结束,每组有一个n(n<10000),然后有n个正整数a[i](1<=a[i]<=20) 输出
- 输出最大的结果由于结果比较大,结果对10086取余 样例输入
-
3 1 2 3 3 5 1 2
样例输出
-
9 15
这道题考虑到两点就可以做出来了:
只有1需要加到别的数字上,其他的就直接乘就可以了;
前面2就可以直接加到上面,否则就加到小值上面。
将特殊测试出来就应该差不多了。
#include <stdio.h>
const int maxn = 10005, MOD = 10086;
int a[maxn];
void print ( int n )
{
printf ( "**\n" );
for ( int i = 1; i <= n; i ++ )
printf ( "%d ", a[i] );
printf ( "\n" );
}
//只有1需要加到别的数字上,其他的就直接乘就可以了
//前面有2就可以直接加到上面,否则就加到小值
int main ( )
{
int n, ans, x, y;
while ( ~ scanf ( "%d", &n ) )
{
for ( int i = 1; i <= n; i ++ )
scanf ( "%d", &a[i] );
//print ( n );
for ( int i = 1; i <= n; i ++ )
{
if ( a[i] == 1 ) //只需要对1进行处理就行了
{
if ( i == 1 ) //第一个 后面那个加1
a[i+1] ++;
else if ( i == n ) //最后一个就需要循环,有可能前面那个为0
{
y = n-1;
while ( a[y] == 0 )
y --;
a[y] ++;
}
else
{
x = i-1, y = i+1;
if ( a[x] == 2 ) //前面那个为2就直接加
a[x] ++;
else
{
while ( x > 0 && a[x] == 0 )
x --; //找到第一个不为0的数,肯定不为2
a[x] <= a[y] ? a[x] ++ : a[y] ++; //找小的那个数加1
}
}
a[i] = 0;
}
}
ans = 1;
for ( int i = 1; i <= n; i ++ )
{
if ( a[i] )
ans = ans*a[i]%MOD;
}
printf ( "%d\n", ans );
}
return 0;
}
/*
4
2 1 1 2
5
1 1 1 1 2
5
1 1 1 1 1
4
1 1 1 1
*/