前言
最近要上机考试,因此还是对以前做过的题目做一个复习回顾,自己重新手写一遍,纯属回顾,代码风格不好请海涵,考完试以后我把考了的点都标记了一下方便以后学弟学妹们复习了,2333
迭代递归
汽水瓶(考试考了类似的)
题目描述
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
输入
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1≤n≤100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。
输出
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出 0
样例输入
3
10
81
0
样例输出
1
5
40
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
while(cin>>n){
if(n == 0 )break;
int a,b;
int result = 0;
while(n >= 3){
a = n/3;
b = n%3;
result += a;
n = a+b;
}
if( n ==2) result += 1;
printf("%d",result);
}
return 0;
}
跳台阶(考试考了类似的)
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
输入
多组测试样例。每组测试样例包含一个整数n。(1<=n<=100)
输出
每组测试样例输出一行,表示青蛙跳上n级台阶的跳法数量.
所得到的结果模1000000007
样例输入
3
4
样例输出
3
5
#include <bits/stdc++.h>
using namespace std;
const int l=1000000007;
long long dp[205]={
0};
unsigned long long solve_1(int n ){
static long long count[205] = {
0};
if(count[n] != 0 ) return count[n]; //这里有点像备忘录方法,不然直接递归这题会超时
if(n<=0) return 0;
else if( 1 == n) return 1;
else if( 2 == n) return 2;
count[n] = solve_1(n-1)+solve_1(n-2)%l;
return count[n];
}
void solve_2(int n){
dp[0] = 1;
dp[1] = 1;
for(int i =2 ; i <= n; i++){
dp[i] = (dp[i-1]+dp[i-2])%l; //关键是这个递推式
}
cout<<dp[n]<<endl;
}
int main(){
int n;
while(cin>>n){
cout<<solve_1(n)<<endl;//递归
solve_2(n); //动态规划
}
return 0;
}
进制转换(考试考了类似的)
题目描述
输入一个十进制正整数,然后输出它所对应的八进制数。
输入
输入一个十进制正整数n(1≤n≤106) 。
输出
输出n对应的八进制数,输出在一行。
样例输入
10
样例输出
12
#include <bits/stdc++.h>
using namespace std;
void solve(int num){
int s[100];
int i=0;
int tmp=0;
while(num!=0){
tmp = num%8;
num = num/8;
s[i++] = tmp;
}
for(int j=i-1;j>=0;j--){
cout<<s[j];
}
cout<<endl;
}
/*这个题目也可以用栈去模拟,几进制自己灵活变通*/
int main(){
int a;
cin>>a;
solve(a);
return 0;
}
排列问题
题目描述
输入一个可能含有重复字符的字符串,打印出该字符串中所有字符的全排列。
输入
单组测试数据,输入数据是一个长度不超过10个字符的字符串,以逗号结尾。
输出
打印出该字符串中所有字符的全排列。以字典序顺序输出,用空格分隔。
样例输入
abc,
样例输出
abc acb bac bca cab cba
#include <bits/stdc++.h>
using namespace std;
char a[200];
int main(){
cin>>a;
int lena = strlen(a);
do
{
for( int i = 0; i < lena-1; i++ ) {
cout << a[i]; } cout << " ";
} while( next_permutation(a, a+lena-1) ); //关键是这个函数
return 0;
}
全排列
#include <bits/stdc++.h>
using namespace std;
char a[100];
void Perm(char *list,int k,int m){
if( k == m){
for(int i=0 ;i <= m; i++) cout<<list[i];
cout<<" ";
}else{
for(int i=k; i<=m; i++){
swap(list[k],list[i]);
Perm(list,k+1,m);
swap(list[k],list[i]); //关键是换位之后记得还原现场
}
}
}
int main(){
cin>>a;
int lena = strlen(a);
a[lena-1] = '\0';
lena = strlen(a);
sort(a,a+lena);
Perm(a,0,lena-1);
return 0;
}
矩形滑雪场
题目描述
zcb喜欢滑雪。他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形。为了得到更快的速度,滑行的路线必须向下倾斜。 例如样例中的那个矩形,可以从某个点滑向上下左右四个相邻的点之一。例如24-17-16-1,其实25-24-23…3-2-1更长,事实上这是最长的一条。
输入
第1行:两个数字r,c(1 ≤ r, c ≤ 100),表示矩阵的行列。第2…r+1行:每行c个数,表示这个矩阵。
输出
仅一行:输出1个整数,表示可以滑行的最大长度。
样例输入
5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
样例输出
25
#include <bits/stdc++.h>
using namespace std;
int r,c;
int m[105][105];
int record[105][105]={
0};
int m_x[4] = {
0,0,1,-1};
int m_y[4] = {
1,-1,0,0};
int dfs(int x, int y)