蓝桥杯 - C++ calculation

题目链接:点击打开链接


题目大意:注意表达式、基本式的形式限制了很多,所以并不是很难。


解题思路:初始 a++ 、++a 的情况算一波,然后系数从小到大排序,因为 a 是逐渐递增+1的,然后保证 a 是从 1、2、3... 开始算的。

1
-5*a++-3*++a+a++
~

-3*++a+a+++5*a++

原始:

a0: 2 + 2 + 3

拆分:
a1: 1 + 0 + 0

a2: 1 + 2 + 3


AC 代码

扫描二维码关注公众号,回复: 905608 查看本文章
#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a);

using namespace std;

typedef long long ll;
char s[110000];
int prr[11000];

int main()
{
    int a;
    while(~scanf("%d%s",&a,s))
    {
        int len=strlen(s);
        if(s[0]!='-')
        {
            for(int i=len;i>0;i--)
                s[i]=s[i-1];
            s[0]='+';
            len++;
        }

        int k,p,q=0,sum=0;
        for(int i=0;i<len;i+=3)
        {
            if(s[i++]=='+')
                k=1;
            else
                k=-1;

            p=0;
            while(i<len&&'0'<=s[i]&&s[i]<='9')
                (p*=10)+=s[i++]-'0';
            if(s[i]=='*')
                i++;
            else
                p=1;

            prr[q++]=k*p;
            sum+=(a-(s[i]=='a'))*k*p;
        }

        sort(prr,prr+q);

        for(int i=1;i<=q;i++)
        {
            sum+=i*prr[i-1];
        }

        printf("%d\n",sum);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/dream_weave/article/details/80260913