Problem A: 青蛙过河
Description
一条小溪尺寸不大,青蛙可以从左岸跳到右岸,在左岸有一石柱L,面积只容得下一只青蛙落脚,同样右岸也有一石柱R,面积也只容得下一只青蛙落脚。有一队青蛙从尺寸上一个比一个小。我们将青蛙从小到大,用1,2,…,n编号。规定初始时这队青蛙只能趴在左岸的石头L上,当然是一个落一个,小的落在大的上面。不允许大的在小的上面。在小溪中有S个石柱,有y片荷叶,规定溪中的柱子上允许一只青蛙落脚,如有多只同样要求一个落一个,大的在下,小的在上。对于荷叶只允许一只青蛙落脚,不允许多只在其上。对于右岸的石柱R,与左岸的石柱L一样允许多个青蛙落脚,但须一个落一个,小的在上,大的在下。当青蛙从左岸的L上跳走后就不允许再跳回来;同样,从左岸L上跳至右岸R,或从溪中荷叶或溪中石柱跳至右岸R 上的青蛙也不允许再离开。问在已知溪中有S根石柱和y片荷叶的情况下,最多能跳过多少只青蛙?
Input
多组测试数据,先输入一个整数T,表示组数,然后输入然后输入t行,每行输入2个整数s和y
Output
对于每组测试数据,请输出最多能跳过的青蛙数
Sample Input
3
0 1
0 2
1 1
Sample Output
2
3
4
可以看一下这个
代码实现
#include<bits/stdc++.h>
using namespace std;
int count(int s,int y)
{
if(s==0) return y+1;
else return 2*count(s-1,y);
}
int main()
{
int t,s,y;
while(cin>>t)
while(t--)
{
cin>>s>>y;
cout<<count(s,y)<<endl;
}
return 0;
}
Problem B: 深入浅出学算法017-猴子爬山
Description
一个猴子在一座不超过30级的小山上爬山跳跃,猴子上山一步可跳1级或跳3级,试求上山有多少种不同的爬法
Input
多组测试数据,每组输入1个整数n,表示山的台阶数
Output
对于输入的整数n求出多少种爬法
Sample Input
30
Sample Output
58425
思路
猴子可以是从上一格上来的
也可能是迈三步上来的
代码
#include<iostream>
using namespace std;
int main()
{
int n,f[40]={1,1,1,2};
while(cin>>n)
{
for(int i=4;i<=n;i++)
f[i]=f[i-1]+f[i-3];
cout<<f[n]<<endl;
}
return 0;
}
Problem C: 深入浅出学算法018-兔子繁殖
就上面改成 f[i]=f[i-1]+f[i-2] 就行
Problem D: 开宝箱2
Description
急先锋是一个商人,有一天找到了一个宝箱,宝箱需要正确的密码才能打开。同时他发现宝箱上有一个数字,和一份密码表。密码表上有n个密码,只有一个密码是正确的。
急先锋所在的岛上有m个地点,每个地点有两个神秘的数字。他通过交易得到每个地点上拥有的信息,也知道这个宝箱上的数字是一个地点的标号x。急先锋需要先到x号地点,x号地点上的第一个数字就是他要去的最终地点的标号,最终的地点上的第二个数字就是密码在密码表上的序号。
由于宝箱中的宝物价值太大。每过一段时间,有些地点上的数字将会发生变化。
急先锋想要知道打开这个宝箱的密码,聪明的你能不能直接告诉他呢?
Input
第一行两个数字n,m.(1<=n,m<=20)
接下来n个数字ai表示密码表上序号1到序号n的密码分别是多少。(1 <=ai<=100)
接下来m行每行两个数字u,v。(1 <= u<=m,1<= v <=n)
然后给你一个T,表示T次操作。(1<=T<= 20)
接下来的T行,每行的第一个数字op,表示第op种操作。
第1种操作:接下来有一个数字x,表示宝箱上的数字。(1<=x<=m)。
第2种操作:接下来有三个数字x,u,v,表示x号地点的数字改成u,v。
Output
每次执行第一种操作1后,输出一个数字表示最后的密码。(每个数字占1行)。
Sample Input
5 4
1 2 3 4 5
2 4
3 3
1 2
2 5
4
1 1
2 1 4 2
1 1
1 2
Sample Output
3
5
2
思路
题目不难
就是数据多 有点复杂 拿出笔写一写就不难
#include<iostream>
using namespace std;
int main()
{
int n,m,a[30],dd[30][2],t,op,x,u,v,i;
while(cin>>n>>m)
{
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=m;i++)
cin>>dd[i][0]>>dd[i][1];
cin>>t;
while(t--)
{
cin>>op;
if(op==1)
{
cin>>x;
cout<<a[dd[dd[x][0]][1]]<<endl; //这一句画个图就懂了
}
else if(op==2)
{
cin>>x>>u>>v;
dd[x][0]=u;
dd[x][1]=v;
}
}
}
return 0;
}
Problem E: 找气球
Description
zstu集训队经常举办月赛,但是气球经常不够.现有多个桶,每个桶有一种颜色,每个桶可能对应多个题,给定每个题对应的桶,打比赛的时候,经常某道题被发现是水题,但是该颜色的气球没有了,所以quxing201606只能用另一种颜色的气球代替,即把某个桶颜色改成另一种颜色.quxing201606还想知道某道题是什么颜色(属于的桶的颜色).(必须使用指针数组完成!!!)
Input
多组测试,两个数n,m,(n<=100)表示n个题,(m<=100)表示m个桶.接下来m个数,第i个数表示第i个桶对应的颜色.然后n个数,表示第i题属于哪个桶.接下来一个q(<=100),表示q个操作,然后q行,每行第一个op,表示是什么操作.op为1时,两个数x,y,表示把x个桶的颜色变化为y.op为2时,一个数x,表示查询第x题的气球颜色
Output
对于每个op为2的操作输出一个数,表示该题对应的气球是什么颜色
Sample Input
3 2
3 4
1 1 2
3
2 1
1 1 2
2 2
Sample Output
3
2
跟上题相似 不赘述
#include<iostream>
using namespace std;
int main()
{
int n,m,tong[110],ti[110],q,op,x,y,i;
while(cin>>n>>m)
{
for(i=1;i<=m;i++)
cin>>tong[i];
for(i=1;i<=n;i++)
cin>>ti[i];
cin>>q;
while(q--)
{
cin>>op;
if(op==2)
{
cin>>x;
cout<<tong[ti[x]]<<endl;
}
else if(op==1)
{
cin>>x>>y;
tong[x]=y;
}
}
}
return 0;
}
Problem F: 指针函数
函数指针基本知识
函数指针 顾名思义 就是指向函数的指针
每个函数都占用一段内存单元,它们有一个入口地址(起始地址)
在C语言中,函数名代表函数的入口地址。
我们可以定义一个指针变量,接收函数的入口地址,让它指向函数,这就是指向函数的指针,也称为函数指针。
通过函数指针可以调用函数,它也可以作为函数的参数。
这里的int都改成void也是没有问题的 毕竟因为他没有返回值嘛
这样就实现了用函数指针调用函数的功能
然后你再看看题目的提示:写两个函数 算面积 然后再写一个 用上面两个做参数算面积 这样应该能理解了
Description
YHZ自认为很聪明的人, 在C语言课上老师布置了一个作业,让能求正方形和圆的面积, 正当YHZ要跃跃欲试的时候, 老师却要求使用函数指针来实现这个功能,YHZ立马就不会了,他现在向你求助,你能帮他完成这个程序吗?
提示:
编写calAreaSquare(double x)函数来计算边长为x的正方形面积。
编写calAreaCircle(double x)函数来计算半径为x的圆面积。
编写calArea函数用以上两个函数作为参数实现求正方形和圆的面积。
Pi的求法
#include<math.h>
Pi= acos(-1.0)
Input
第一行有一个正数T表示有T个询问。 接下来有T行,每行有一个正数op, 和一个浮点数x,
如果op = 1, x 表示正方形的边长。 如果 op = 2, x 表示圆的半径。
Output
输出只有一行表示所求的面积(保留五位小数)。
Sample Input
2
1 2
2 1
Sample Output
4.00000
3.14159
代码实现
其实我觉得这个题目要实现这个功能也是自找麻烦
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
double Pi = acos(-1.0);
double calAreaSquare(double x)
{return x*x;}
double calAreaCircle(double x)
{return Pi*x*x;}
double calArea(double x,int *op)
{
double (*square)(double);
double (*circle)(double);
square=calAreaSquare;
circle=calAreaCircle;
if(*op==1)
printf("%.5f\n",(*square)(x));
else if(*op==2)
printf("%.5f\n",(*circle)(x));
}
int main()
{
int t,op;
double x;
while(cin>>t)
{
while(t--)
{
cin>>op>>x;
if(op==1)
calArea(x,&op);
else if(op==2)
calArea(x,&op);
}
}
return 0;
}
Problem G: 铺地砖
Description
元旦过去了,新年大酬宾活动也已经告一段落了。陈盖历望着堆在仓库的瓷砖,很无聊的他把这些瓷砖裁成很多1X1 1X2 1X3的小瓷砖,然后他把这些小瓷砖排在地上画的一个1*n的长方形里。问铺满这个长方形共有多少种方法?
Input
首先输入一个整数T,表示有T组测试数据 然后是T行,每行输入1个正整数n(n<=50)
Output
对于每个n输出铺的方法种数
Sample Input
3
1
2
3
Sample Output
1
2
4
还有一道一模一样的题:骨牌铺法
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[100],i,t,n;
while(cin>>t)
{
while(t--)
{
cin>>n;
a[1]=1;a[2]=2;a[3]=4;
for(i=4;i<=n;i++)
a[i]=a[i-1]+a[i-2]+a[i-3];
cout<<a[n]<<endl;
}
}
return 0;
}