一家公司生产产品。生产以非常神秘的方式完成。该公司或者一天要生产一种额外的产品,或者可以将前一天的产品产量提高一倍。最初,他们只有1种产品,一天后,它们恰好具有“ n”种产品。您需要找出最少的天数才能制作出完全“ n”个产品。 测试用例: n = 8 输出= 3 说明:如果每天的产量翻一番,那么三天之内可以生产1 x 2 x 2 x 2 = 8个产品。 再多一点: 15产品OUTPUT 6 对于19个产品OUTPUT 6
答案 0 :(得分:0)
您需要使用动态编程解决此问题。对于给定的n
产品,请从下至上开始填充。请通过您的测试用例找到以下代码:
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
int main()
{
int n = -1, i =0, tmp=0;
// int result = -1;
printf("\nEnter value: ");
scanf("%d", &n);
if (n == -1)
return -1;
if(n == 1)
{
printf("\nOnly a single day");
return 0;
}
int *arr = malloc(n*sizeof(int));
for (i=0; i<n; i++)
arr[i]=INT_MAX;
arr[0] = 1;
for(i=1; i<n; i++)
{
arr[i] = arr[i-1] + 1;
if ((i+1)%2 == 0)
{
tmp = arr[(i+1)/2 - 1] + 1;
if (tmp < arr[i])
arr[i] = tmp;
}
}
printf("\nResult: %d", arr[n-1]-1);
}
输出:
测试案例1:
Enter value: 8
Result: 3
测试案例2:
Enter value: 15
Result: 6
测试案例3:
Enter value: 19
Result: 6
代码说明:
您需要构造一个数组,其中包含与值一样多的元素。例如。如果值为8,则需要构造具有8个元素的数组。然后,您需要处理值2,3,4 ....直到8。由于开始时,问题表明您已经拥有1
,所以不需要值1。数组元素中的值表示天数。数组索引应为index = value -1
。
您的最终目标是到达8
。但是您需要从头开始。您需要问自己,用值2
能做的最好的事情(最少的天数)?它是前一个元素的值+1(因为问题表明您要么day's value = previous day's value + 1
做),要么是您对当前元素的当前值加1
的一半做的最好(问题表明您可以也要在第二天乘以2)。无论哪个数字少,您都将其分配给当前值的索引。该逻辑位于每个索引的for
循环内。
您将步骤3,4,....重复到8。现在,当您到达8
时,索引(8-1
)上的值包含开始的天数,因此您需要减去1并最终显示该值。