zoukankan      html  css  js  c++  java
  • UVa 1583

    1.题目大意

    如果a加上a的各个数字之和得到b,则说a是b的生成元。给出n其中$1le nle 100000$,求其最小生成元,若没有解则输出0。

    2.思路

    使用打表的方法打出各个数字a对应的b,存入s[b]中。

    3.应注意的问题

    (1) 没有解时输出0,也就意味着在开始打表前要把数组s[maxn]清零。利用memset实现,要加入string.h的头文件,而memset对数组操作时只能初始化为0或-1。

    (2) 要求求出的是最小生成元,也就意味着在存入s[b]之前要有所比较。

    4.代码

    #include"stdio.h"
    #include"string.h"
    #define maxn 100005
    int s[maxn];
    int main()
    {
        int i,T,n,a,b;
        memset(s,0,sizeof(s)); //数组清零
        for(i = 1; i < maxn ; i++)
        {
            a = i;
            b = i;
            while(a > 0)    //原数加上其各个数字之和得到a
            {
                b += a%10;
                a /= 10;
            }  
            if((s[b]==0) || (s[b]>i))  //确保其是最小生成元
                s[b] = i;
        }
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            printf("%d
    ",s[n]);
        }
        return 0;
    }
    

      

    参考书目:算法竞赛入门经典(第2版) 刘汝佳 编著

  • 相关阅读:
    BZOJ2512 : Groc
    BZOJ3644 : 陶陶的旅行计划
    BZOJ1439 : YY的问题
    BZOJ2872 : 优莱卡
    BZOJ3273 : liars
    BZOJ4133 : Answer的排队
    URAL Palindromic Contest
    ZOJ Monthly, January 2018
    BZOJ2689 : 堡垒
    2017-2018 ACM-ICPC, Central Europe Regional Contest (CERC 17)
  • 原文地址:https://www.cnblogs.com/rgvb178/p/5947701.html
Copyright © 2011-2022 走看看