link
题意:
求n个数,这n个数和10进制为s,求他们11进制的最大值。
思路:
考虑先能不能无花费拆分,这里的无花费指的是两个数在11进制相加还是原数,例如2030,2和3都是可以拆的,拆成1030和1000,然后如果数列中还不满足的话,那么这些数都是满足100…这种形式的。由于花费要小,我们可以贪心的选择最小的数,并且拆掉一个次高位。例如1000拆成900和100,如果拆成1和999,和比前面那种拆法小,不优。
代码:
// Problem: D. Expression Evaluation Error
// Contest: Codeforces - Codeforces Round #742 (Div. 2)
// URL: https://codeforces.com/contest/1567/problem/D
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define x first
#define y second
typedef pair<int,int> pii;
bool check(int x)
{
int cnt=0;
int mx=0;
while(x)
{
cnt+=(x%10>0);
mx=max(mx,x%10);
x/=10;
}
return cnt>=2||mx!=1;
}
int len(int x)
{
int res=0;
while(x)
{
res++;
x/=10;
}
return res;
}
int main()
{
int _;
cin>>_;
while(_--)
{
int s,n;
cin>>s>>n;
vector<int>v;
v.push_back(s);
while(v.size()<n)
{
bool flag=1;
for(int i=0;i<v.size();i++){
int j=v[i];
if(check(j))
{
flag=0;
int dd=j;
v.erase(v.begin()+i);
int mx=(int)pow(10,len(dd)-1);
v.push_back(mx);
v.push_back(dd-mx);
break;
}
}
if(flag)
{
int minv=1e9;
int id=0;
for(int i=0;i<v.size();i++)
{
if(v[i]<minv && v[i]!=1)
{
minv=v[i];
id=i;
}
}
v.erase(v.begin()+id);
int mx=(int)pow(10,len(minv)-2);
v.push_back(minv-mx);
v.push_back(mx);
}
}
for(auto x:v) cout<<x<<" ";
cout<<endl;
}
}
/**
* In every life we have some trouble
* When you worry you make it double
* Don't worry,be happy.
**/