贪心算法——01

      1. 有n个需要在同一天使用同一个教室的活动a1,a2,…,an,教室同一时刻只能由一个活动使用。每个活动ai都有一个     开始时间si和结束时间fi,一旦被选择后,活动ai就占据半开时间区间[si,fi)。如果[si,fi]和[sj,fj]互不重叠,ai和aj两个活动就可以被安排在这一天。该问题就是要安排这些活动使得尽量多的活动能不冲突的举

                                        


      

package data_11_28;

import java.util.Arrays;
import java.util.Scanner;
public class tanxin_01 {
	/**
	 * 
	 * 1.排序 抓住 最快结束的开始
	 */
	
	static class cl{
		int start;
		int end;
		
	}
	
	static boolean judge(cl a,cl b){
		
		return a.end<=b.start;
	}
    public static void main(String[] ages){
    	Scanner sc=new Scanner(System.in);
    	//输入个数
    	int n=sc.nextInt();
    	int sum=1,j=1;
         cl[] a=new cl[n+1];
         //赋值
         for(int i=1;i<=n;i++){
        	 a[i]=new cl();
        	 a[i].start=sc.nextInt();
        	 a[i].end=sc.nextInt();
             if(i!=1&&a[i].end<a[i-1].end){
            	 a[0]=a[i];
            	 a[i]=a[i-1];
            	 a[i-1]=a[0];      	 
             }
         }
         //判断
         for(int i=2;i<=n;i++){
        	 if(judge(a[j],a[i])){
        		 j=i;
        		 sum++;
        	 }
         }
         
         System.out.println(sum);
    }
}


程序 = 数据结构 + 算法  程序是为了解决实际问题而存在的。然而为了解决问题,必定会使用到某些数据结构以及设计一个解决这种数据结构的算法。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。编程实战算法,不是念PPT,我们讲的就是实战与代码实现与企业应用。程序 = 数据结构 + 算法                ——图灵奖得主,计算机科学家N.Wirth(沃斯)作为程序员,我们做机器学习也好,做python开发也好,java开发也好。有一种对所有程序员无一例外的刚需 —— 算法与数据结构日常增删改查 + 粘贴复制 + 搜索引擎可以实现很多东西。同样,这样也是有任何竞争力的。我们只可以粘贴复制相似度极高的功能,稍复杂的逻辑有任何办法。语言有很多,开发框架更是日新月异3个月不学就落后我们可以学习很多语言,很多框架,但招聘不会考你用5种语言10种框架实现同一个功能。真正让程序员有区分度,企业招聘万年不变的重点 —— 算法与数据结构。算法代表程序员水平的珠穆朗玛。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。 想写出精炼、优秀的代码,不通过不断的锤炼,是很难做到的。 开这个系列的目的是为了自我不断积累。不积跬步无以至千里嘛。
<think>好的,我需要帮用户理解贪心算法在装船问题中的应用和实现。首先,我得回忆装船问题的基本概念,以及贪心算法的原理。装船问题要求在不超过货船最大载重量的情况下,选择货物使得总价值最大。贪心算法在这里的应用通常是基于某种局部最优的选择,比如价重比。 根据用户提供的引用,问题描述是选择若干货物,使得总重量不超过M,而总价重比最大。这里的价重比指的是每单位重量的价值,即p_i/w_i。所以,贪心策略应该是优先选择价重比高的货物,直到载重量用完。 接下来,我需要整理实现步骤。首先计算每种货物的价重比,然后按照这个比例从高到低排序。排序后依次选取货物,直到无法再装下更多的货物。这里需要注意,可能需要部分装载某一种货物,但根据引用中的输入描述,p_i是w_i的整数倍,可能意味着每种货物可以分割,或者必须整件装载?需要仔细看问题要求。 查看引用[4],输入描述中提到p_i是w_i的整数倍,这可能意味着货物可以按整数倍分割,比如如果选择部分重量,价值也按比例计算。但问题输出是整数,所以可能需要全部装载或者不装,但根据价重比的计算方式,可能允许部分装载。不过,根据代码示例中的做法,用户提供的引用[1]提到使用冒泡排序按价重比排序,然后选择货物直到载重用完,可能这里的货物是可以分割的,即可以取部分重量,这样总价值就是按照价重比计算的。比如,如果剩余载重不足以装下全部某货物,就装部分,此时价值为剩余载重乘以价重比。 然后,实现步骤包括计算价重比、排序、贪心选择。代码中的排序部分引用[1]指出冒泡排序效率低,建议改用快速排序,但装船问题中货物种类固定为10种,所以冒泡排序可能足够,但作为一般情况可能需要更高效的算法。 用户可能想知道具体的实现代码,但根据问题中的引用,代码示例中的结构可能涉及结构体存储货物信息,计算价重比,排序,然后遍历。例如,定义一个货物结构体,包含p、w、c(价重比),然后排序,再累加。 需要注意的问题包括排序的正确性,如何处理剩余载重,以及是否允许部分装载。根据引用中的问题描述,输出是最大价值,而输入中的p_i是w_i的整数倍,可能允许部分装载,但需要确认。例如,若货物A有w=2吨,p=4,价重比2。如果剩余载重为1吨,那么可以装0.5个货物A,得到价值1吨×2=2。但根据输入p_i是w_i的整数倍,这样分割后价值可能还是整数。 在代码实现中,引用[1]提到使用冒泡排序,但可以优化为快速排序。因此,在示例代码中,可能使用快速排序来提高效率,尤其是当货物种类较多时。 总结回答的结构应该是:问题描述、贪心策略(按价重比排序)、实现步骤、代码示例、优化建议、应用场景,以及潜在问题和注意事项。同时,生成相关问题,如与其他算法对比、时间复杂度和处理不可分割货物的情况等。 需要确保所有数学公式用$...$,比如价重比表示为$c_i = \frac{p_i}{w_i}$,独立公式用$$...$$。例如,总价值的计算公式可能需要单独成段。 最后,根据引用中的信息,正确添加引用标记,如引用[1]提到使用冒泡排序,可以将其放在对应段落末尾。同时,确保回答使用中文,代码语法正确,结构清晰。</think>### 贪心算法在装船问题中的实现与应用 #### 一、问题描述 装船问题要求从$N$种货物中挑选若干吨装入货轮,**总重量不超过$M$吨**,且**总价值最大化**。引用中明确说明,货物可分割(因$p_i$是$w_i$的整数倍),因此允许选择部分货物[^4]。 #### 二、贪心策略设计 贪心算法的核心是**价重比优先**,即优先选择$\text{价重比} = \frac{\text{价值}}{\text{重量}}$最高的货物。这一策略的数学表示为: $$c_i = \frac{p_i}{w_i}$$ 通过按$c_i$降序排序,逐步装载直至载重$M$耗尽[^1]。 #### 三、实现步骤 1. **计算价重比**:遍历所有货物,计算$c_i = p_i / w_i$ 2. **排序**:按$c_i$从高到低对货物排序(冒泡排序或更优算法) 3. **贪心选择**:依次装载货物,若当前货物重量$\leq$剩余载重,则全装;否则装部分[^3] #### 四、代码实现(Python) ```python def load_ship(M, goods): # 计算价重比并排序 sorted_goods = sorted(goods, key=lambda x: x[0]/x[1], reverse=True) total_value = 0 remaining = M for p, w in sorted_goods: if remaining >= w: total_value += p remaining -= w else: total_value += (p / w) * remaining break # 载重已满 return int(total_value) # 因p_i是w_i整数倍,结果必为整数 # 示例输入:M=100, goods格式为[(p1, w1), (p2, w2), ...] print(load_ship(100, [(60, 10), (120, 30), (100, 20)])) # 输出:240 ``` #### 五、优化与注意事项 1. **排序效率**:当$N$较大时,冒泡排序$O(n^2)$效率低,可改用快速排序$O(n \log n)$[^1] 2. **输入约束**:$p_i$是$w_i$的整数倍,确保部分装载时价值仍为整数 3. **空间优化**:无需存储完整结构体,直接使用元组排序 #### 六、应用场景 1. 物流运输中的**集装箱装载优化** 2. 资源分配问题(如云计算资源调度) 3. 背包问题的简化版本(可分割物品)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值