您的位置:首页 > 其它

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

2015-11-29 14:58 411 查看
这题还是比较简单的,然而更加觉得自己真心蒟蒻,可以在保存时就只保存最小的,然而我是保存了所有的,在输出时才比较。


#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
[0]; i++)
if(g
[i] < min)
min = g
[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 100005
int 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
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息