算法题-汽水瓶
汽水瓶
https://www.nowcoder.com/questionTerminal/fe298c55694f4ed39e256170ff2c205f
题目描述
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
输入描述:
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。
输出描述:
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。
F(N) = N / 3 + F(N / 3 + N % 3)
F(0) = 0
F(1) = 0
F(2) = 1
根据动态规划的思想,可以构建一个容纳101个元素的数组保存每个结果值,代码如下:
#include <bits/stdc++.h> using namespace std; std::array<int, 101> aResult; int Func(int iLocation) { if(aResult.at(iLocation) != -1) { return aResult.at(iLocation); } else { aResult[iLocation] = iLocation / 3 + Func(iLocation / 3 + iLocation % 3); return aResult.at(iLocation); } } int main() { //由题意能推导出: F(n) = n / 3 + F(n / 3 + n % 3) //F(0) = 0 F(1) = 0 F(2) = 1 aResult.fill(-1); aResult.at(0) = 0; aResult.at(1) = 0; aResult.at(2) = 1; int iInput; while(std::cin >> iInput) { if(0 == iInput) { break; } std::cout << Func(iInput) << std::endl; } return 0; }
解法二:
根据数据,可推断出喝到的汽水总瓶数实际就是开始拥有空瓶子数量的1/2:(见下图)
空瓶数量 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
喝到的汽水总数 | 0 | 1 | 1 | 2 | 2 | 3 | 3 | 4 | 4 | 5 | 5 |
#include<bits/stdc++.h> int main(int argc, char * argv[]) { int m; while(~scanf("%d",&m)&&m!=0) printf("%d\n",m/2); return 0; }