[SMOJ1820][未AC][来自 DalaoOI’2017 小甲]第六题 最大与最小(minmax)

背景:

记得上星期教主lws说今年DLOI’(就是DaolaoOI)蛮有意思的,并给我们展示了第六题:Minmax说这题你们可以做一下。
——台下,大佬们一片唏嘘,说:这不就是贪心吗
——Lws笑了,用那支白板笔敲了敲黑板:“是贪心啊,但关键是怎么贪呢?”

题目描述:

琳琳正在研究一个只有加法和乘法的算术式,假设她可以合法的任意加括号,你能帮她能求出这个算术式可能得到的最大值和最小值吗?参与运算的数据项都是正整数,数据项的个数不超过10(即每个数据项的大小为1到10)。

输入格式:

输入数据只有一行,是一个合法的算术式,两项之间都有一个空格。

输出格式:

输出数据有两行,第一行为能得到的最大值,第二行为能得到的最小值。

样例输入:

2 + 3 * 5 + 4 =

样例输出:

45
21

贴心的样例解释:

(2+3)*(5+4)=45
2+3*5+4=21

过程:

首先上来,我在草稿本上随便写几个算式,经过我几番精密的研究,发现似乎有这个规律:
基本的想法:尽可能的用尽量大的数作乘法运算,是最大的,反之是最小的(?)
最大解决方案:尽可能把作加法运算的数“利用括号”结合起来,遇到乘号,乘起来,似乎就是最大的。
最小解决方案:似乎,按照原式运算,就是最小的,因为我想:乘在一起的,不可能用括号分开嘛。

结果:

写了一个多小时,各种不爽,字符串处理烦成狗,但终于写完了,只有七十分,绞尽脑汁了,各位大佬麻烦帮我看看:

贴代码:

#include 
#include 
#include 
#include 

using namespace std;
string st;
int s,sum,tot,nums[105],themax,themin;

string IntoCtype(char s[255]) { return s;}
string NoSpace_(string st)
{
    string result;
    for (int i=0;iif (st[i]!=' ') result=result+st[i];
    return result;
}

int intonum_(string st)
{
    //Wtf? 好烦,递归搞了好久,直接暴力 
    if (st=="1") return 1;
    if (st=="2") return 2;
    if (st=="3") return 3;
    if (st=="4") return 4;
    if (st=="5") return 5;
    if (st=="6") return 6;
    if (st=="7") return 7;
    if (st=="8") return 8;
    if (st=="9") return 9;
    if (st=="10") return 10;    
}

int main()
{
    freopen("1820.in","r",stdin);
    freopen("1820.out","w",stdout);


    char Temst_[255];
    cin.getline(Temst_,255);
    st=IntoCtype(Temst_); //嗯,Lyy教我的小技巧== 
    st=NoSpace_(st); //Wtf? 输入竟然还有空格,,,烦啊 

    //找最大先 是不是让加号尽可能结合 

    s=0; tot=0; sum=0;
    for (int i=0;iif ('0'>st[i] || st[i]>'9')
        {
            bool gsign=st[i]=='*'; 
            string Temst_=st.substr(s,i-s);
            int gnum=intonum_(Temst_);
            sum=sum+gnum;
            if (gsign) 
            {
                tot++;
                nums[tot]=sum;
                sum=0;
            } 
            s=i+1;
        }
    } 
    tot++;
    nums[tot]=sum;

    themax=1;
    for (int i=1;i<=tot;i++) themax=themax*nums[i]; 
    printf("%d\n",themax);

    //找最小 怎么搞,按原式?
    tot=0; sum=1; s=0;
    bool gsign,lastgsign;
    lastgsign=1; 
    for (int i=0;iif ('0'>st[i] || st[i]>'9')
        {
            gsign=st[i]=='+'; 
            string Temst_=st.substr(s,i-s);
            int gnum=intonum_(Temst_);
            if (!lastgsign) sum=sum*gnum;else sum=gnum;
            if (gsign) 
            {
                tot++;
                nums[tot]=sum;
                sum=1;
            } 
            s=i+1;
        }
        lastgsign=gsign; 
    } 
    tot++;
    nums[tot]=sum;

    themin=0;
    for (int i=1;i<=tot;i++) themin=themin+nums[i]; 
    printf("%d",themin);

    return 0;
}

Ps:

还有好像Markdown编辑蛮好用的,又好看…

你可能感兴趣的:(算法)