nyoj1170

来源:互联网 发布:发票二维码扫描软件 编辑:程序博客网 时间:2024/06/05 20:38

最大的数
时间限制:1000 ms | 内存限制:65535 KB
难度:3

描述
小明和小红在打赌说自己数学学的好,于是小花就给他们出题了,考考他们谁NB,题目是这样的给你N个数
在这n个数之间添加N-1个*或+,使结果最大,但不可以打乱原顺序,请得出这个结果

1 3 5
结果是(1+3)*5=20;最大
可以添加若干个括号,但一定要保证配对,但是每两个数之间只可能有一个*或+
数列最前和最后不应有+或乘
小明想赢小红但是他比较笨,请你帮帮他

输入
多组测试数据以EOF结束,每组有一个n(n<10000),然后有n个正整数a[i](1<=a[i]<=20)
输出
输出最大的结果由于结果比较大,结果对10086取余
样例输入

31 2 335 1 2

样例输出

915
#include<stdio.h>int a[10005];void f(int l,int r){    if(a[l]==2)//如果是2,果断加1,3得出的乘积比1+1=2大    {        a[l]++;        return ;    }    if(a[l]==0)//当有2的时候会在前面出现一个0,那么就把标记移动到前面的那个3上    {        l--;    }    a[l]<=a[r]?a[l]++:a[r]++;//优先向左加,因为是从左向右贪心,那么右面所出现的东西是未知的,所以向左加,比如4 1 4 1 } int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        int i,j;        for(i=0;i<n;i++)        {            scanf("%d",&a[i]);        }        if(a[0]==1)//如果第一个数是1,那么就让他后面的数加1,自己变成0        {            a[1]++;            a[0]=0;        }        for(i=1;i<n-1;i++)        {            if(a[i]==1)            {                a[i]=0;                f(i-1,i+1);            }        }        if(a[n-1]==1&&n>1)//最后一个数如果是1那么只能往前找一个数加上        {            for(i=n-2;!a[i];i--);            a[i]++;            a[n-1]=0;                   }        int sum;        for(i=0,sum=1;i<n;i++)        {            if(a[i])            {                sum=(sum*a[i])%10086;//相乘            }        }        printf("%d\n",sum);    }}
0 0
原创粉丝点击