linkkkkk
题意:
给出s , n要求将s拆成n个数,使得这些数的和是s并且按照11进制计算得到的和最大。
思路:
如果将10拆成了1 + 9,那么和就从( 10 ) 11 = 11变成了( 9 + 1 ) 11,损失了1.
所以尽量将同一位上的整数放在一起,比如123 = 100 + 20 + 3
如果不得不拆的话,就尽量在较低的高位中拆分,将100拆成10 + 90比将100拆成99 + 1损失小。前者是1 0 11 + 9 0 11 = 1 ∗ 11 + 9 ∗ 11 = 110,后者是9 9 11 + 1 11 = 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; }