贪心算法解蓝桥杯JavaB组晚会节目

/**

  • /**

  • 问题描述
      小明要组织一台晚会,总共准备了 n 个节目。然后晚会的时间有限,他只能最终选择其中的 m 个节目。
      这 n 个节目是按照小明设想的顺序给定的,顺序不能改变。
      小明发现,观众对于晚上的喜欢程度与前几个节目的好看程度有非常大的关系,他希望选出的第一个节目尽可能好看,
    在此前提下希望第二个节目尽可能好看,依次类推。
    // 字典序最大
      小明给每个节目定义了一个好看值,请你帮助小明选择出 m 个节目,满足他的要求。
    输入格式
      输入的第一行包含两个整数 n, m ,表示节目的数量和要选择的数量。
      第二行包含 n 个整数,依次为每个节目的好看值。
    输出格式
      输出一行包含 m 个整数,为选出的节目的好看值。
    样例输入
    5 3
    3 1 2 5 4
    样例输出
    3 5 4
    样例说明
      选择了第1, 4, 5个节目。
    评测用例规模与约定
      对于 30% 的评测用例,1 <= n <= 20;
      对于 60% 的评测用例,1 <= n <= 100; 时间复杂度 50*50=2500
      对于所有评测用例,1 <= n <= 100000,0 <= 节目的好看值 <= 100000。
    10 5
    54 59 12 36 43 22 6 89 12 10
    10 5
    10 9 8 7 6 5 4 3 2 1

  • //贪心算法求区间最大值可得60分
    */
    import java.util.Scanner;
    public class Ten_Ans {
    public static void main(String[] args) {
    //键盘接收输入
    Scanner sca = new Scanner(System.in);
    //节目数量
    int num = sca.nextInt();
    //保留节目数量
    int lpro = sca.nextInt();
    //数组存储节目好看度
    int[] pros = new int[num];
    for(int i = 0; i < num; i++) {
    pros[i] = sca.nextInt();
    }
    sca.close();
    //指针1的位置
    int local1 = 0;
    //指针2的位置要保证能选取最少节目数量就是保留节目数量
    int local2 = num-lpro;
    //最好看的节目
    int max = pros[local1];
    //辅助指针
    int temp = 0;

    while(true) {
        //指针重合或者节目选完
         if(local2==local1||lpro==0) {
       	  break;
         }
        for(int i = local1 ;i <= local2 ;i++) {
       	
       	 //找到当前区间最好看的节目
       	     if(max<pros[i]) {
       	    	 max = pros[i];
       	    	 temp = i;	
       	     }
       	    
        }
        //输出区间最好看节目
        System.out.print(max+" ");
        //指针1后移
       
        local1 = temp+1;
        
        //指针2后移
        if(local2<pros.length-1) {
       	 local2++;
        }
        //保留节目数减少
        lpro--;
        //下一个节目暂定最好看节目
        max = pros[local1];
        //temp位置要与最好看节目位置一样
        temp = local1;
       
    }
    //如果节目没选完,指针重合,那剩下的节目必须全部入选
    if(lpro!=0) {
        for(int i = local1;i < pros.length; i++)
       	 System.out.print(pros[i]+" ");
    }
    

    }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值