NYOJ 1170 最大的数 贪心

来源:互联网 发布:mac chrome 书签位置 编辑:程序博客网 时间:2024/06/05 09:09


最大的数

时间限制: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
来源
calamity_coming
上传者
ACM_孙毓阳

思考:主要是对一进行处理,左加还是右加。

#include<stdio.h>#define MOD 10086int s[10005];void add(int a,int b){    if(s[a]==2)    {        s[a]++;        return;    }    while(!s[a])//找到前一个不为0的数,其实要么是s[a],要么是s[a-1]        a--;    s[a]<=s[b]?s[a]++:s[b]++;//当s[a]=s[b]时也必须s[a]++}int main(){    int t;    while(~scanf("%d",&t))    {        int ans=1;        for(int i=0;i<t;i++)            scanf("%d",&s[i]);        if(s[0]==1)            s[0]=0,s[1]++;        for(int i=1;i<t-1;i++)            if(s[i]==1)                s[i]=0,add(i-1,i+1);        if(s[t-1]==1)        {            s[t-1]=0;            int j=t-2;            while(!s[j])                j--;            s[j]++;        }        for(int i=0;i<t;i++)            if(s[i])            {                ans*=s[i];                if(ans>=MOD)                    ans%=MOD;            }        printf("%d\n",ans);    }}

原创粉丝点击