KamaCoder(三)

题目来源于:卡码网KamaCoder

题解来源于:GitHub - youngyangyang04/kamacoder-solutions: 卡码网题解全集 

求和

题目描述

输入两个整数n, m,从数列 1, 2, ..., n 中随意取几个数字,使其和等于 m,要求将所有的可能的组合列出来。

输入

输入只有一行,第一个数字为 n,第二个数字为 m。

输出

按每个组合的字典序排列输出,每行输出一种组合。

样例输入 
5 5
样例输出 
1 4
2 3
5
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @author light
 * @Description 求和
 * @create 2023-08-31 19:06
 */
public class n10 {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		int n=input.nextInt();
		int m=input.nextInt();
		getResult(m, n);

	}

	
	public static List<Integer> path=new ArrayList<>();
	public static void getResult(int m,int n){
		backtracking(m,n,0,1);
	}

	private static void backtracking(int m, int n,int sum, int startIndex) {
		if(sum>m){
			return;
		}
		if(sum==m){
			for (int i = 0; i < path.size()-1; i++) {
				System.out.print(path.get(i)+" ");
			}
			System.out.println(path.get(path.size() - 1));

		}
		for (int i = startIndex; i <=n&&sum+i<=m; i++) {
			path.add(i);
			sum+=i;
			backtracking(m,n,sum,i+1);
			path.remove(path.size()-1);
			sum-=i;
		}

	}
}

 到达目的地最短距离

题目描述

在数轴上,有一个点(坐标为x)可以移动。

这个点遵循移动规则如下: 

1. 在数轴上向前移动一格,即 x = x + 1
2. 在数轴上向后移动一格,即 x = x - 1
3. 在数轴上移动到当前位置数值的两倍:即 x = x * 2 

现这个点在原点,求将这个点移动到位置 X 所需要的最少移动次数。

输入

输入仅有一个整数,代表位置 X。

输出

输出一个整数,代表最少移动次数。

样例输入 
3
样例输出 
3


import java.util.Scanner;

/**
 * @author light
 * @Description  问题: 到达目的地的最短距离
 *
 * 在数轴上,有一个点(坐标为x)可以移动。
 *
 * 这个点遵循移动规则如下:
 *
 * 1. 在数轴上向前移动一格,即 x = x + 1
 * 2. 在数轴上向后移动一格,即 x = x - 1
 * 3. 在数轴上移动到当前位置数值的两倍:即 x = x * 2
 *
 * 现这个点在原点,求将这个点移动到位置 X 所需要的最少移动次数。
 *
 *(思路:动态规划
 *
 * @create 2023-08-31 19:08
 */
public class n11 {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		int x=input.nextInt();
		System.out.println(getMinDistance(x));
	}

	private static int getMinDistance(int x) {
		if ( x < 2 && x >= 0) {
			return x;
		}
		// 处理 x 为负数的情况
		if (x < 0) {
			x = -x;
		}
		//求将这个点移动到位置X所需要的最少移动次数为dp[i]。
		int[] dp=new int[x+1];
		/*
		一、如果当前的位置能够被 2 整除,只有一种走法
		    从别的位置,通过在数轴上移动到当前位置数值的两倍方式移动过来的。
		    dp[i] = dp[i / 2] + 1;

		二、如果当前的位置不能被 2 整数,有两种走法
		    1. 通过在数轴上向前移动一格的方式移动过来的
		    2. 通过在数轴上向后移动一格的方式移动过来的

		    dp[i] = Math.min(dp[i - 1], dp[(i + 1) / 2] + 1) + 1

		    第 1 种走法为 dp[i - 1] 不难理解
		    为什么第 2 种走法会是 dp[(i + 1) / 2] + 1 呢?
		    因为如果当前位置不能被整除,那么这个位置的后一个位置必定能被整除,能被整除的坐标参考能被整除的走法。
		 */
		dp[0]=0;
		dp[1]=1;
		for (int i = 2; i <=x ; i++) {
			if(i%2==0){
				dp[i]=dp[i/2]+1;
			}else {
				dp[i]=Math.min(dp[i-1],1+dp[(i+1)/2])+1;
			}
		}
		return dp[x];
	}
}

### 关于 KamaCoder 网站的功能与特 KamaCoder 是一个专注于 ACM 模式练习的学习平台,旨在帮助编程爱好者提升算法能力和熟悉常见数据结构的操作[^1]。该网站由知名算法博主代码随想录创建,提供了一系列精选的 25 道题目,这些题目覆盖了多种核心知识,包括但不限于数组、链表、树、图等基础数据结构以及动态规划、贪心算法等多种经典算法。 #### 功能概述 - **多语言支持**:KamaCoder 提供 C++、Java、Python 和 C 四种主流编程语言的支持,允许用户自由选择熟悉的开发环境来解决问题。 - **在线评测系统**:用户可以提交自己的解决方案,并获得即时反馈,查看运行时间、内存消耗以及其他性能指标的结果分析。 - **社区互动**:除了个人练习外,还可以浏览其他用户的解答思路及其优化建议,从而促进交流学习氛围。 此外,未来计划中的卡码笔记将进一步扩展其教育价值,成为代码随想录知识星球内的一个重要组成部分。它不仅能够满足基本技能训练需求,还将引导学员深入参与到实际项目的建设过程中去——即打造属于他们自己的个性化学习空间,在那里完成技术文档整理和技术面试准备等工作的同时也增强了动手实践的能力[^2]。 对于希望提高自己编码技巧或者备战各类程序设计竞赛的朋友来说,这无疑是一个非常值得尝试的好地方! ```python # 示例代码展示如何利用并查集解决路径查找问题 class UnionFind: def __init__(self, n): self.parent = list(range(n)) def find(self, u): if self.parent[u]!=u: self.parent[u]=self.find(self.parent[u]) return self.parent[u] def join(self,u,v): pu,pv=self.find(u),self.find(v) if pu==pv:return False self.parent[pu]=pv return True def isSame(self,u,v): return self.find(u)==self.find(v) uf=UnionFind(10) # 初始化大小为10的并查集实例 print(uf.join(1,2)) # 将节1和2连接起来 print(uf.isSame(1,2)) # 判断节1和2是否在同一集合中 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值