linkkkkk
题意:
给出
s
,
n
s,n
s,n,要求将
s
s
s拆成
n
n
n个数,使得这些数的和是
s
s
s并且按照
11
11
11进制计算得到的和最大。
思路:
如果将
10
10
10拆成了
1
+
9
1+9
1+9,那么和就从
(
10
)
11
=
11
(10)_{11}=11
(10)11=11变成了
(
9
+
1
)
11
(9+1)_{11}
(9+1)11,损失了
1
1
1.
所以尽量将同一位上的整数放在一起,比如
123
=
100
+
20
+
3
123=100+20+3
123=100+20+3
如果不得不拆的话,就尽量在较低的高位中拆分,将
100
100
100拆成
10
+
90
10+90
10+90比将
100
100
100拆成
99
+
1
99+1
99+1损失小。前者是
1
0
11
+
9
0
11
=
1
∗
11
+
9
∗
11
=
110
10_{11}+90_{11}=1*11+9*11=110
1011+9011=1∗11+9∗11=110,后者是
9
9
11
+
1
11
=
1
∗
1
+
9
∗
1
+
9
∗
11
=
109
99_{11}+1_{11}=1*1+9*1+9*11=109
9911+111=1∗1+9∗1+9∗11=109
代码:
int main() {
int _=read;
while(_--){
int s=read,n=read;
vector<int>res;//记录答案
int x=1e9;
while(x>=1){//从高位往低位划分,尽量按照整数位划分,如果必须要拆分的话,拆分损失小的低位
if(n==1){//只剩一个数,直接输出就好
res.push_back(s);break;
}
if(s-x<n-1){//保证剩下的能够凑齐
x/=10;
continue;
}
res.push_back(x);
s-=x;n--;
}
for(auto t:res) cout<<t<<" ";
puts("");
}
return 0;
}