「杂题乱刷2」CF1567D
duel 到的。
题目链接
解题思路
发现在越高的数位上,你获取的利益就会越大。
因此你肯定是每次将尽可能多的数分到最高的数位上是最优的。
但是你会发现,有可能你这样分数位后后面的数就分不到权值了,你只需要保证去掉当前分掉的权值之后,剩下可以分的权值不小于还剩下没分到的数字数量即可。
接下来我们考虑一种没有损耗权值的方式。
根据前面加粗的结论,你发现,对于前 \(n - 1\) 个数字,你直接分最大的能分的 \(10\) 的非负整数次幂是没有损耗的,最后一个数字直接把当前能用的都用了即可。
参考代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define re register
#define ll long long
#define forl(i,a,b) for(re ll i=a;i<=b;i++)
#define forr(i,a,b) for(re ll i=a;i>=b;i--)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
#define QwQ return 0;
ll _t_;
void _clear(){}
ll n,m;
ll ans[110];
void solve()
{
_clear();
cin>>n>>m;
forr(i,m-1,1)
{
ll pw=1;
while(n-pw>=i)
pw*=10;
pw/=10;
// ll add=n-max(num,1ll);
cout<<pw<<' ';//max(num,1ll)<<' ';
n-=pw;//max(num,1ll);
}
cout<<n<<endl;
// cout<<endl;
}
int main()
{
IOS;
_t_=1;
cin>>_t_;
while(_t_--)
solve();
QwQ;
}