《算法竞赛入门经典2ndEdition 》例题3-5 生成元(Digit Generator, Uva1583)

来源:互联网 发布:钢铁雄心4mac版汉化包 编辑:程序博客网 时间:2024/05/22 05:25
   这题还是比较简单的,然而更加觉得自己真心蒟蒻,可以在保存时就只保存最小的,然而我是保存了所有的,在输出时才比较。
#include <cstdio>#include <cstring>using namespace std;const int maxn = 100000;int g[maxn + 20][maxn/100];//g[i][j] is a generator of i,(j > 0)                        // g[i][0] is the number of generators of i.int main(){  //freopen("New Text Document.txt","r",stdin);  //freopen("Output.txt","w",stdout);  int t;  memset(g, 0, sizeof(g));  scanf("%d", &t);  for(int i = 1; i <= maxn; i++)  {    int x = i, y = 0;    while(x != 0)     {      y += x%10;      x /= 10;    }    if(i + y <= maxn) g[i+y][++g[i+y][0]] = i;  }  for(int i = 1; i <= t; i++)  {    int n;    scanf("%d",&n);    int min = maxn*2;    for(int i = 1; i <= g[n][0]; i++)      if(g[n][i] < min)         min = g[n][i];    if(min == maxn*2) printf("0\n");    else printf("%d\n",min);  }  //getchar();getchar();  return 0;} 

下面这个是刘汝佳标程,里面的while(T--)感觉很巧妙,之前我都是在循环体里面进行T-- 然后在循环条件是判断T >= 0 ,另外的确不需要保存所有的生成元,上面我的那个程序在这点上的确做的不好。

// UVa1583(LA3355) Digit Generator// Rujia Liu#include<stdio.h>#include<string.h>#define maxn 100005int ans[maxn];int main() {  int T, n;  memset(ans, 0, sizeof(ans));  for(int m = 1; m < maxn; m++) {    int x = m, y = m;    while(x > 0) { y += x % 10; x /= 10; }    if(ans[y] == 0 || m < ans[y]) ans[y] = m;  }  scanf("%d", &T);  while(T--) {    scanf("%d", &n);    printf("%d\n", ans[n]);  }  return 0;}
2 0
原创粉丝点击