算法上机考试复习

前言

最近要上机考试,因此还是对以前做过的题目做一个复习回顾,自己重新手写一遍,纯属回顾,代码风格不好请海涵,考完试以后我把考了的点都标记了一下方便以后学弟学妹们复习了,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)
  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值