POJ 1003

POJ 1003比较简单,条件里给出了c的范围不超过5.20,方法类似于非递归求Fibonacci,我在代码中计算新的数前先判断能否在已经得到的结果中找到答案。

不过我看别人的代码,貌似不用数组保存结果,每次都直接计算也不会超时,好吧,我想多了。。。

POJ 1003 160K 0MS C++
#include <stdio.h>
#include <stdlib.h>

#define MAX 300 //c at least 0.01 and at most 5.20

int main()
{
	float *sum = (float *)malloc(MAX * sizeof(float));
	int *res = (int *)malloc(MAX * sizeof(int));
	int maxN = 1;
	sum[1] = 0.5;
	float c;
	int i, k = 1;
	do {
		scanf("%f", &c);
		if(c <= 0) break;
		bool extendFlag = false;
		while(sum[maxN] < c){
			maxN ++;
			sum[maxN] = sum[maxN - 1] + 1.0/(maxN + 1);
			extendFlag = true;
		}
		if(extendFlag)
			res[k] = maxN;
		else{
			for(i=1;i<=maxN;i++)
				if(sum[i]>=c)
					break;
			res[k] = i;
		}
		k ++;
	} while(c > 0);
	
	for(i=1;i<k;i++)
		printf("%d card(s)\n", res[i]);
	free(sum);
	free(res);

	return 0;
}
posted @ 2011-09-24 13:48  thomaslee  阅读(388)  评论(0编辑  收藏  举报