题解:
比赛的时候把题看错了,以为只改变‘+’的位置,补题时候,参考代码,发现数字的顺序也可以改变,有点难受,如果是这样的话,那其实挺好想的,按加号分一下块,把数字排一个序,从小到大一遍一遍的往块里加,直到加完,然后用大数加法,把他们相加就好了
不知道为甚一直发生段错误的代码:
#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一直段错误,桶排就过了,也不知道为啥,可能是循环的时候的问题