「雜題亂刷2」CF1567D

wangmarui發表於2024-08-23

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;
}