题目大意:
输入两个数字 s u m , n sum,n sum,n ,让你构造 n n n 个数字,使得他们的十进制之和等于 s u m sum sum ,11进制之和最大
解题思路:
根据进制的计算方法可知,其实就是每一位上的数字乘以进制的几次方,位数越高,值越大,所以就要在能凑够n个数字的前提下,是尽可能多的数字,位数多。代码中有步骤解释。
代码:
#include <bits/stdc++.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#define ll long long
#define qc ios::sync_with_stdio(false); cin.tie(0);cout.tie(0)
using namespace std;
const int MAXN = 2e5 + 7;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
int sz[10]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
int num[105],all,x;
int main()
{
qc;
int t;
cin>>t;
while(t--)
{
cin>>all>>x;
int cnt=0,k=all,sum=0;
memset(num,0,sizeof(num));
while(k)//拆解数字
{
num[++cnt]=k%10;
sum+=k%10;
k/=10;
}
while(sum<x)//当各个位数上的数字之和小于需要构造的数字个数时,就要减小最高位,把他分给下一位
{
for(int i=2;i<=cnt;i++)
{
if(num[i])
{
num[i]--;
num[i-1]+=10;
sum+=9;
break;
}
}
}
ll tmp=0;//注意开LL
while(x>1)//从大到小输出高位数的数字。保留一个数字,凑够sum
{
for(int i=cnt;i>=1;i--)
{
if(num[i])
{
cout<<sz[i-1]<<" ";
tmp+=sz[i-1];
num[i]--;
x--;
break;
}
}
}
tmp=all-tmp;
cout<<tmp<<endl;
}
return 0;
}
碎碎念:
手打sz数组时,竟然1e6少打了一个0,比赛时一直WA,最后时间到了,才发现是那错了!血亏啊!!!