HDOJ1058
题目

代码
思路一:开始我的想法是把某个范围内的数一一测试是否是humble number,是就存进数组里,不是就测试下一个。但这样的代价是时间超了!
//超时代码
#include <stdio.h>
#include <math.h>
int judge_humble(int m)
{
while(m!=1)
{
if(m%2==0)
{
m = m/2;
}
else if(m%3==0)
{
m = m/3;
}
else if(m%5==0)
{
m = m/5;
}
else if(m%7==0)
{
m = m/7;
}
else
{
return 0;
}
}
return 1;
}
int main()
{
int n, i;
int count = 2;
int j = 1;
int num[5850];
num[1] = 1;
while(scanf("%d", &n)&&n!=0)
{
for(i=j+1;count<=n;i++)
{
if(judge_humble(i))
{
num[count] = i;
count++;
}
j = i;
}
if(n%10==1&&n!=11)
{
printf("The %dst humble number is %d.\n", n, num[n]);
}
else if(n%10==2&&n!=12)
{
printf("The %dnd humble number is %d.\n", n, num[n]);
}
else if(n%10==3&&n!=13)
{
printf("The %drd humble number is %d.\n", n, num[n]);
}
else
{
printf("The %dth humble number is %d.\n", n, num[n]);
}
}
}
思路二:参照网上的解法,我去学习了一下stl的优先队列,发现用优先队列真的简单很多。优先队列可以定义成greater或less(区别就是一个自动升序排列,一个自动降序排列)。没错!因为是自动的,就省掉了每次放进队列数字以后要排序的烦恼。首先在优先队列里放一个1,然后乘以2,3,5,7压入队列。每次从优先队列队top的数都是队列里最小的,拿它分别乘以2,3,5,7后压入队列,依次循环。
#include<cstdio>
#include<queue>
using namespace std;
int main()
{
priority_queue <long long,vector<long long>,greater<long long> > q; //small->big
long long num[5850];
num[0] = 0;
int n, i = 1;
q.push(1);
while(scanf("%d", &n)&&n!=0)
{
while(i<=n)
{
if(q.top()!=num[i-1])
{
num[i] = q.top();
q.push(num[i]*2);
q.push(num[i]*3);
q.push(num[i]*5);
q.push(num[i]*7);
i++;
}
q.pop();
}
if(n%10==1&&n%100!=11)
{
printf("The %dst humble number is %lld.\n", n, num[n]);
}
else if(n%10==2&&n%100!=12)
{
printf("The %dnd humble number is %lld.\n", n, num[n]);
}
else if(n%10==3&&n%100!=13)
{
printf("The %drd humble number is %lld.\n", n, num[n]);
}
else
{
printf("The %dth humble number is %lld.\n", n, num[n]);
}
}
}
Conclusion
这次又学会了stl的优先队列,不得不说真的很方便呀。还有vector,map,比一般的数组什么的要好用!
本文探讨了HDOJ1058题目“Humble Numbers”的两种解法,一种是逐个测试是否为谦逊数,另一种利用STL优先队列简化过程,实现高效生成指定数量的谦逊数。

被折叠的 条评论
为什么被折叠?



