例题3-5 Digit Generator UVA - 1583

我还想把它当成一道数学题做,但是发现代码实现太繁琐。直接搜索肯定会超时的,所以我要确定遍历的区间。区间的上界我找到了,但是我无法准确的确定区间下界。所以我觉得这个方法不靠谱,就看了题解。

题解用的预处理,先把所有十万以内的正整数都遍历一遍,得到离i最近的以i为最小生成元的数t。以t为下标,将i赋值给ans[t],继续遍历。如果接下来存在另一个i,为t的生成元,并且比原先的ans[t]更小,就ans[t]=i,否则不处理。最后直接输入一个数,输出答案数组中这个数的值即可。

#include <bits/stdc++.h>
#define N 100005
using namespace std;
int ans[100005];
int main()  {
    int n,p;
    scanf("%d",&n);
    for (int i=1;i<=100000;i++) {
        int sum=i,t=i;
        while (t!=0)    {
            sum+=t%10;
            t/=10;
        }
        if (ans[sum]==0||ans[sum]>i)
            ans[sum]=i;
    }
    while (n--) {
        scanf("%d",&p);
        printf("%d\n",ans[p]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/yichuan-sun/p/9634185.html

时间: 2024-10-10 04:54:15

例题3-5 Digit Generator UVA - 1583的相关文章

例题 3-5 生成元 digit generator

1 #include<stdio.h> 2 #include<string.h> 3 #define maxn 100005 4 int ans[maxn]; //类似于 比较大的数组还是开导外面比较好一点,防止报错. 5 int main() 6 { 7 int x,y,m,T,n; 8 memset(ans,0,sizeof(ans)); //数组归零. 9 for(m=1;m<maxn;m++) //从 1 开始 遍历到 maxn. 10 { 11 x=y=m; //

UVa 1583 Digit Generator(数)

For a positive integer N , the digit-sum of N is defined as the sum of N itself and its digits. When M is the digitsum of N , we call N a generator of M . For example, the digit-sum of 245 is 256 (= 245 + 2 + 4 + 5). Therefore, 245 is a generator of 

uva 1583 B - Digit Generator (暴力)

B - Digit Generator Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description For a positive integer N<tex2html_verbatim_mark> , the digit-sum of N<tex2html_verbatim_mark> is defined as the sum of N&l

Problem 005——Digit Generator

1583 - Digit Generator For a positive integer N , the digit-sum of N is defined as the sum of N itself and its digits. When M is the digitsum of N , we call N a generator of M . For example, the digit-sum of 245 is 256 (= 245 + 2 + 4 + 5). Therefore,

最小生成元 (Digit Generator, ACM/ICPC Seoul 2005, UVa1583)

Question 例题3-5 最小生成元 (Digit Generator, ACM/ICPC Seoul 2005, UVa1583) 如果x+x的各个数字之和得到y,就是说x是y的生成元.给出n(1<=n<=100000), 求最小生成元.无解输出0.例如,n=216,121,2005时的解分别是198,0,1979. Think 方法一:假设所求生成元记为m,不难发现m<n.换句话说,只需枚举所有的m<n,看看有木有哪个数是n的生成元.此举效率不高,因为每次计算一个n的生成元

UVA1583 UVALive3355 Digit Generator

Regionals 2005 >> Asia - Seoul 问题链接:UVA1583 UVALive3355 Digit Generator.基础训练级的题,用C语言编写. 看题意,请点击上述链接. 查表法最为合理,即使试探法可能性太多,而且求最小的生成元比较困难. 不打表估计时间上也会超时. 程序中,打表功能封装到函数maketable(),使得主函数变得简洁.另外,打表时需要注意数组下标溢出问题.还需要注意,求的是最小生成元. AC通过的C语言程序如下: /* UVA1583 UVALi

Digit Generator(水)

题目链接:http://acm.tju.edu.cn/toj/showp2502.html2502.   Digit Generator Time Limit: 1.0 Seconds   Memory Limit: 65536K Total Runs: 2426   Accepted Runs: 1579 For a positive integer N, the digit-sum of N is defined as the sum of N itself and its digits.

UVa 1583 Digit Generator(数学)

 题意 如果a加上a所有数位上的数等于b时 a称为b的generator  求给定数的最小generator 给的数n是小于100,000的  考虑到所有数位和最大的数99,999的数位和也才45  因此我们只需要从n-45到n枚举就行了 #include<cstdio> #include<cstring> using namespace std; int t, n, a, b, ans, l; int main() { scanf ("%d", &

生成元(Digit Generator,ACM/ICPC Seoul 2005,UVa 1583)

#include<cstdio>#include<cstdlib>#include<cstring>using namespace std;int t, n, a, b, ans, l;int main(){ scanf("%d", &t);//这句话是为了确定一个最大的范围,比如说10000 while (t--) { scanf("%d", &n); ans = 0; for (int i = n - 50;