链接
题意:
给出一个数n,让你求分成最少个数,使得所有数和为n,并且这些数,每个位都为是(1,2,3)
分析:
首先其实我们只需要明白我们将每一位都分成(1,2,3)那么我们肯定从最高位看,看最少能分成多少个数,如果比原本之前的答案小(就是原本个数这一位置上都是1,不够用),那么说明我们还借位,从前面借1,然后继续判断即可。
ll n, m;
string str;
ll a[N];
void solve()
{
cin >> n;
for(int i = 0; i < 20; i++){/// 获取每一位上是什么
a[i] = n%10;
n /= 10;
}
bool flag=0;
ll ans=1e9+7;
while(!flag){有答案则退出
ll num = 0; ///答案
flag = 1;
for(int i=20;i>=0;i--){
if(a[i] < num){/// 如果该位置的数小于分的组数
a[i]+=10;/// 找前面借一位
a[i+1] --;
flag=0;///接为了,就说明我们得在去判断一下
break;
}
num = max(num,(a[i]+2)/3);///最少组数。
}
if(flag) ans=num;
}
cout<<ans<<endl;
}