牛客:最小表达式

在这里插入图片描述
题目连接

题解:

比赛的时候把题看错了,以为只改变‘+’的位置,补题时候,参考代码,发现数字的顺序也可以改变,有点难受,如果是这样的话,那其实挺好想的,按加号分一下块,把数字排一个序,从小到大一遍一遍的往块里加,直到加完,然后用大数加法,把他们相加就好了

不知道为甚一直发生段错误的代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn=5e6+5;
string s[maxn];
ll p[maxn];
string add(string s1,string s2)
{
    ll j,l,la,lb;
    string ma,mi;
    ma=s1;
    mi=s2;
    if(s1.length()<s2.length())
    {
        ma=s2;
        mi=s1;
    }
    la=ma.size();
    lb=mi.size();
    l=la-1;
    for(j=lb-1; j>=0; j--,l--)
        ma[l] += mi[j]-'0';
    for(j=la-1; j>=1; j--)
        if(ma[j]>'9')
        {
            ma[j]-=10;
            ma[j-1]++;
        }
    if(ma[0]>'9')   //处理第一位超过9了。
    {
        ma[0]-=10;
        ma='1'+ma;
    }
    return ma;
}
int main()
{
    string str;
    cin>>str;
    ll cur=1,cnt=1,len=str.size();
    for(ll i=0; i<len; i++)
    {
        if(str[i]=='+')
            cur++;
        else
            p[cnt++]=(str[i]-'0');
    }
//    ll dis=len/cur+(len%cur!=0);
    sort(p,p+cnt);
    string st;
    for(ll i=1; i<cnt; i++)
        st[i]=(p[i]+'0');
    ll j=1,i=1;
    while(j<cnt)
    {
        if(i<=cur)
        {
            s[i]+=st[j];
            i++;
        }
        else
        {
            i=1;
            s[i]+=st[j];
            i++;
        }
        j++;
    }
    string ans;
    for(ll i=1;i<=cur;i++)
        ans=add(ans,s[i]);
    cout<<ans<<endl;
}

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn=5e6+5;
string s[maxn];
ll p[20];
string add(string s1,string s2)
{
    ll j,l,la,lb;
    string ma,mi;
    ma=s1;
    mi=s2;
    if(s1.length()<s2.length())
    {
        ma=s2;
        mi=s1;
    }
    la=ma.size();
    lb=mi.size();
    l=la-1;
    for(j=lb-1; j>=0; j--,l--)
        ma[l] += mi[j]-'0';
    for(j=la-1; j>=1; j--)
        if(ma[j]>'9')
        {
            ma[j]-=10;
            ma[j-1]++;
        }
    if(ma[0]>'9')   //处理第一位超过9了。
    {
        ma[0]-=10;
        ma='1'+ma;
    }
    return ma;
}
int main()
{
    string str;
    cin>>str;
    ll cur=1,cnt=1,len=str.size();
    for(ll i=0; i<len; i++)
    {
        if(str[i]=='+')
            cur++;
        else
            p[str[i]-'0']++;
    }
    int j=1;
    for(int i=0; i<=9; i++)
    {
        while(p[i])
        {
            if(j<=cur)
            {
                s[j]+=(i+'0');
                j++;
            }
            else
            {
                j=1;
                s[j]+=(i+'0');
                j++;
            }
            p[i]--;
        }
    }
    string ans;
    for(int i=1; i<=cur; i++)
        ans=add(ans,s[i]);
    cout<<ans<<endl;
}

两个代码的不同就是一个用sort,一个用桶排,sort一直段错误,桶排就过了,也不知道为啥,可能是循环的时候的问题

发布了222 篇原创文章 · 获赞 16 · 访问量 9731

猜你喜欢

转载自blog.csdn.net/yangzijiangac/article/details/104314978
今日推荐