1583 - Digit Generator

Problem.png

输入一个数,找出这个数的最小生成元。
生成元的意思是:一个整数,比如245,它本身加上它各位数之和等于256 (= 245 + 2 + 4 + 5),则245就是256的一个生成元。
这题有一个笨办法是对每一个输入整数N,枚举小于N的所有数,看他们是否是N的生成元,这种方法显然耗时太多。
有一个比较巧妙的方法是,题中的N最大值为100000,则我们对0~100000范围内的所有数,计算它们能成为哪些数的生成元(即能生成哪些数),以那些数为数组的索引,值为对应的生成元建立映射,则遍历一遍十万个数,就能建立一个映射数组,后面只需要按照输入来查表即可。

这种技巧感觉挺重要,对于某类映射问题,可以先枚举所有数造一个映射表,后面只需按照输入查表,可以节约很多时间。

#include <iostream>

using namespace std;

int gen[110000] = {0};

int main() {
    int T;
    cin >> T;
    for (int i = 100000; i >= 0; i--) {
        int sum = i, d = i;
        while (d) {
            sum += d % 10;
            d /= 10;
        }
        gen[sum] = i;
    }
    while (T) {
        int num;
        cin >> num;
        cout << gen[num] << endl;
        T--;
    }
}

另外还要注意,本题是求最小生成元,因此从大到小枚举所有数,让新算出来的较小的生成元覆盖掉旧的较大的生成元,从而最终得到的是最小生成元。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,913评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,025评论 25 709
  • 十月,清冷的街头,你可能会路遇一只不走寻常路的狗。 它穿着本属于人类的“华丽衣衫”,迎着一路慈母般宠爱的惊叫,只用...
    槽值阅读 13,125评论 37 204
  • 01 苇苇是我的发小。 我们两从流着口水蹒跚学步的时候就认识彼此了,每天形影不离,加上家长总喜欢给我们买一样的衣服...
    萌萌叨叨叨阅读 5,526评论 2 2
  • 假如生活欺骗了你, 你的衣柜里没有少一件衣服, 去年的衣服也配的上今年的你, 听说永不沉默的船,说翻就翻了。。...
    MONTH十三阅读 1,405评论 0 0

友情链接更多精彩内容