「杂题乱刷2」CF1567D

duel 到的。

题目链接

CF1567D

解题思路

发现在越高的数位上,你获取的利益就会越大。

因此你肯定是每次将尽可能多的数分到最高的数位上是最优的。

但是你会发现,有可能你这样分数位后后面的数就分不到权值了,你只需要保证去掉当前分掉的权值之后,剩下可以分的权值不小于还剩下没分到的数字数量即可。

接下来我们考虑一种没有损耗权值的方式。

根据前面加粗的结论,你发现,对于前 \(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;
}
posted @ 2024-08-23 22:58  wangmarui  阅读(9)  评论(2编辑  收藏  举报