Quasi Binary CodeForces - 538B

原题链接

考察: 思维+构造

错误思路: 

         以451为例.这道题不是从大到小枚举,再取余,存在取小的数更优的情况.dfs一定超时,完全背包不便记录路径.

思路:

        我们的集合只包含0与1的数.如果要表示451的4一定需要4个100,5需要5个10.以此类推,由此n每位数字的最大值就是答案的最小长度.

        然后考虑怎么构造答案.451 需要4个100,5个10,1个1. 我们需要长度尽量小就尽量加在一起. 111 110*3 10

       参考了大佬的极简代码:

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 const int N = 11;
 5 int nums[N],ans,n;
 6 int main()
 7 {
 8     scanf("%d",&n);
 9     for(int i=1;i<=n;i*=10)
10     {
11         int res = n/i%10;
12         ans = max(res,ans);
13         for(int j=1;j<=res;j++) nums[j] += i;
14     }
15     printf("%d\n",ans);
16     for(int i=ans;i;i--) printf("%d ",nums[i]);
17     if(ans) printf("\n");
18     return 0;
19 }

 

  

posted @ 2021-05-09 23:45  acmloser  阅读(47)  评论(0编辑  收藏  举报