蓝桥杯 算法训练 2的次幂表示 (递归)

算法训练 2的次幂表示  
时间限制:1.0s   内存限制:512.0MB
    
问题描述
  任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。
  将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0
  现在约定幂次用括号来表示,即a^b表示为a(b)
  此时,137可表示为:2(7)+2(3)+2(0)
  进一步:7=2^2+2+2^0 (2^1用2表示)
  3=2+2^0  
  所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
  又如:1315=2^10+2^8+2^5+2+1
  所以1315最后可表示为:
  2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入格式
  正整数(1<=n<=20000)
输出格式
  符合约定的n的0,2表示(在表示中不能有空格)
样例输入
137
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
样例输入
1315
样例输出
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
提示
  用递归实现会比较简单,可以一边递归一边输出


参考博客:http://blog.csdn.net/enjoying_science/article/details/44089733

自己老是想不到,一看别人的代码就明白了。。还是太菜。


#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
void f(int n) {
	int a[32];
	int m = n;
	int cnt = 0, i = 0;
	int t;
	while(m) {
		t = m % 2;
		if(t) a[cnt++] = i;
		i++;
		m /= 2;
	}
	for(i = cnt - 1; i >= 0; i--) {
		if(a[i] == 0) printf("2(0)");
		else if(a[i] == 1) printf("2");
		else if(a[i] == 2) printf("2(2)");
		else {
			printf("2(");
			f(a[i]);
			printf(")");
		}
		if(i != 0) printf("+");
	}
}
int main() {
	//freopen("input.txt", "r",stdin);
	int n;
	scanf("%d", &n);
	f(n);
	puts("");
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 蓝桥杯算法训练中的采油区域问题是一个典型的动态规划问题。题目给出一个维矩阵,每个格子代表一个油田,有不同的价值。要求找出一个采油区域,使得采油区域中所有的油田的总价值最大。 解决这个问题可以使用动态规划的思想。我们定义一个维数组dp,dp[i][j]表示当采油区域的右下角位置为(i, j)时的最大总价值。那么对于dp[i][j],它可以由左边的位置dp[i][j-1]、上边的位置dp[i-1][j]和左上角位置dp[i-1][j-1]推导出来。 具体的状态转移方程为:dp[i][j] = max(dp[i][j-1], dp[i-1][j], dp[i-1][j-1]) + matrix[i][j],其中matrix[i][j]代表第i行第j列油田的价值。 在计算dp数组时,循环遍历矩阵的每个位置,并根据状态转移方程更新相应的dp值。最后,dp[m-1][n-1]就是所求的最大总价值,其中m和n分别为矩阵的行数和列数。 具体的Python代码如下: ```python def maxOilValue(matrix): m, n = len(matrix), len(matrix[0]) dp = [[0] * n for _ in range(m)] dp[0][0] = matrix[0][0] for i in range(1, m): dp[i][0] = dp[i-1][0] + matrix[i][0] for j in range(1, n): dp[0][j] = dp[0][j-1] + matrix[0][j] for i in range(1, m): for j in range(1, n): dp[i][j] = max(dp[i][j-1], dp[i-1][j], dp[i-1][j-1]) + matrix[i][j] return dp[m-1][n-1] # 测试 matrix = [[3, 7, 9, 2], [2, 1, 3, 6], [8, 5, 6, 4]] print(maxOilValue(matrix)) ``` 以上是用Python解决蓝桥杯算法训练中采油区域问题的方法。在具体实现中,我们使用了一个维数组来保存每个位置的最大总价值,并应用了动态规划的思想。最后,输出了矩阵中采油区域的最大总价值。 ### 回答2: 采油区域问题是一道经典的算法训练问题,通常使用深度优先搜索算法来解决。在Python中,可以使用递归函数实现深度优先搜索。 蓝桥杯采油区域问题描述了一个由n*n的网格组成的维地图,每个格子上标有一个非负整数,表示该格子上的石油储量。要求选取一个区域,该区域由相邻的格子组成(上下左右),使得区域中所有格子的石油储量和最大。 解决这个问题的关键是要遍历所有可能的区域,并计算每个区域的石油储量和。可以从地图上的每个位置开始进行深度搜索,将每个位置的格子都作为第一个格子,递归地搜索周围的相邻格子。搜索过程中记录当前区域的石油储量和,并更新最大储量和的值。 以下是一个用Python实现的采油区域问题的代码示例: ```python # 深度优先搜索 def dfs(grid, i, j, visited): m, n = len(grid), len(grid[0]) if i < 0 or i >= m or j < 0 or j >= n or visited[i][j]: return 0 visited[i][j] = True res = grid[i][j] + dfs(grid, i+1, j, visited) + dfs(grid, i-1, j, visited) + dfs(grid, i, j+1, visited) + dfs(grid, i, j-1, visited) return res # 采油区域 def oilArea(grid): m, n = len(grid), len(grid[0]) visited = [[False] * n for _ in range(m)] maxOil = float('-inf') for i in range(m): for j in range(n): maxOil = max(maxOil, dfs(grid, i, j, visited)) return maxOil # 示例 grid = [ [1, 3, 2, 5], [2, 2, 1, 7], [3, 1, 5, 9], [4, 1, 2, 4] ] print(oilArea(grid)) ``` 对于给定的地图,该代码将计算出最大石油储量和,并将结果打印出来。在这个示例中,最大石油储量和为22。 ### 回答3: 采油区域问题是蓝桥杯算法训练中常见的一道题目。题目描述如下:给定一个矩阵,表示一个采油区域,每个单元格的数值代表这个区域的油田价值。现在需要找到一个不相交的矩形区域,使得这个区域内的油田价值之和最大。 解题思路可以采用动态规划的方法。首先定义一个维数组dp,dp[i][j]表示以坐标(i, j)为右下角的不相交矩形区域的最大油田价值之和。那么,我们可以根据dp[i-1][j-1]、dp[i-1][j]和dp[i][j-1]来更新dp[i][j]的值,即: dp[i][j] = max(dp[i-1][j-1] + oil[i][j], dp[i-1][j], dp[i][j-1]) 其中,oil[i][j]表示坐标(i, j)处的油田价值。 接下来,我们可以通过遍历整个矩阵,不断更新dp数组得到最终的结果。遍历时,我们可以从第一行和第一列开始,因为考虑到边界情况,我们可以初始化一个额外的行和列,将其值设置为0。 最后,我们只需取dp数组中的最大值,即为所求的最大油田价值之和。 在Python中,我们可以用一个维列表来表示矩阵,并使用嵌套循环来进行遍历和更新dp数组的操作。最后返回dp数组中的最大值即可。 以下是一个实现示例: def maxOil(matrix): rows = len(matrix) cols = len(matrix[0]) dp = [[0] * (cols + 1) for _ in range(rows + 1)] for i in range(1, rows + 1): for j in range(1, cols + 1): dp[i][j] = max(dp[i-1][j-1] + matrix[i-1][j-1], dp[i-1][j], dp[i][j-1]) return dp[rows][cols]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值