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