问题 G: 汽水瓶 时间限制: 1 Sec 内存限制: 128 MB 提交: 93 解决: 45 201501010119 提交状态讨论版 题目描述 有这样一道智力题:“某商店规定:三个空汽水瓶能够换一瓶汽水。小张手上有十个空汽水瓶,她最多能够换多少瓶汽水喝?”答案是5瓶,方法以下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完之后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。而后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完之后用3个空瓶子换一瓶满的还给老板。若是小张手上有n个空汽水瓶,最多能够换多少瓶汽水喝? 输入 输入文件最多包含10组测试数据,每一个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不该当处理这一行。 输出 对于每组测试数据,输出一行,表示最多能够喝的汽水瓶数。若是一瓶也喝不到,输出0。 样例输入 Copy 3 10 81 0 样例输出 Copy 1 5 40
看样例:输入10,9个瓶子换三瓶能够喝的汽水=》n=10/3=3; 现有的空瓶子=喝掉的三瓶(变为空瓶子)+剩下的一个空瓶=》10/3+10%3=4;四个空瓶子取三个还能够换饮料,发现回到了最初的步骤:拥有的空瓶子数量/3;
直到拥有的空瓶子剩下两个,向老板接借一个(+1),除以3就兑换完汽水啦~
其实吧,想要更简单的代码就直接观察样例,发现答案就是输入的n除以2(固然是计算机里的整除)
#include <bits/stdc++.h> using namespace std; int main() { int n; //空瓶子的数量 while(scanf("%d",&n)&&n) { int a; //喝的汽水数量 a=0; //注意归零 while(n>1) //空瓶子大于等于2能够换汽水 { a=a+n/3; //喝的汽水+空瓶子换的汽水 n=n%3+n/3; //上次换汽水剩下的瓶子+空瓶子换的汽水(喝完了就变成空瓶子了) if(n==2) //特殊状况,每次循环判断一次 n++; } cout<<a<<endl; } return 0; }
问题 H: 蜂房 时间限制: 1 Sec 内存限制: 128 MB 提交: 1 解决: 1 201501010119 提交状态讨论版 题目描述 有一只通过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。 其中,蜂房的结构以下所示。 (咳咳,图不见了) 输入 多组数据输入,每组数据包含两个正整数a, b,且 a<b。 输出 蜜蜂从蜂房a爬到蜂房b的可能路线数。 样例输入 Copy 1 2 3 4 样例输出 Copy 1 1
1、a->b的路径能够化归于1->(b-a)的路径状况c++
由于不能反向爬行,且只能爬右侧相邻蜂房,因此决定了能够化归的特殊性(老师上课也讲过了)编程
2、递归的思想函数
假设1->5,反过来看:到达5有两个选择,从3到达,或者从4到达,因此这个数量是由前面两种状况决定的;那么到达3也有两种状况,要么从1要么从2;到达4同理;测试
因此咱们获得一个规律,要到达的目的地数量由前两种方法决定;spa
因此这也是递归的核心;code
而递归的终止条件是:1->1;1->2;1->3;blog
#include <bits/stdc++.h> using namespace std; int f(int n) { if(n<4) //基本条件 return n; else { return f(n-1)+f(n-2); //递归表达式 } } int main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF) { int n; n=b-a; cout<<f(n)<<endl; } return 0; }
问题 K: 骨牌覆盖 时间限制: 1 Sec 内存限制: 128 MB 提交: 0 解决: 0 201501010119 提交状态讨论版 题目描述 用大小为1×2的骨牌铺满一个大小为2×n的长方形方格,编写一个程序,输入n,输出铺放方案总数。例如,输入n=3,即大小为2×3的方格,输出3。3种骨牌铺放方案以下图所示: 输入 多组测试用例,每一组是一个正整数。 输出 每组输出占一行。 只须要输出铺放方案总数,不须要输出具体的铺放方案。 样例输入 Copy 3 样例输出 Copy 3
这个题和上一题代码其实差很少,主要也是找规律获得递推式递归
n=1,n=2,n=3是能够直接获得的(已知条件);内存
从第四块开始,放的砖块有两种状况了,要么横着放要么竖着放,string
横着放有两种放法,也就是f(2);
竖着放就只有一种放法,f(3);
两种放法加起来就是f(4);
以此类推,每一个n的方法都是创建在两种状况下的,而每种状况又能够追溯到最初的已知条件,因此就直接递归咯
#include <bits/stdc++.h>
using
namespace
std;
int
f(
int
n)
{
if
(n<=3) //已知条件
return
n;
else
return
f(n-1)+f(n-2); //递归式,两种状况
问题 I: 倒序输出 时间限制: 1 Sec 内存限制: 128 MB 提交: 0 解决: 0 201501010119 提交状态讨论版 题目描述 使用递归编写一个程序,逆序输出一个正整数。例如输入1234,输出4321。 输入 多组输入,每组输入一个正整数。 输出 逆序输出结果,每一个结果占一行。 样例输入 Copy 12 1234 样例输出 Copy 21 4321
#include <bits/stdc++.h> using namespace std; void f(int n) //递归函数 { int a; //用来存放数的个位 int s=0; if(n==0) return ; else { a=n%10; //分离个位 cout<<a; f(n/10); //去掉个位,再次递归,输出高位
问题 J: 递归求和 时间限制: 1 Sec 内存限制: 128 MB 提交: 0 解决: 0 201501010119 提交状态讨论版 题目描述 使用递归编写一个程序,计算一个正整数中全部数字之和。例如输入234,输出9 输入 多组输入,每组输入一个正整数。 输出 输出结果,每一个结果占一行。 样例输入 Copy 234 样例输出 Copy 9
#include <bits/stdc++.h> using namespace std; int f(int n) {if(n==0) return 0; else { return (n%10+f(n/10)); //分离数的各个位而且加起来而且进入下一次递归 } } int main() { int n; while(scanf("%d",&n)!=EOF) { cout<<f(n)<<endl; } return 0; }
} } int main() { int n; while(scanf("%d",&n)!=EOF) { f(n); cout<<endl; } return 0; }
}
int
main()
{
int
n;
while
(
scanf
(
"%d"
,&n)!=EOF)
{
int
s;
s=f(n);
cout<<s<<endl;
}
return
0;
}