北理工的恶龙

北理工的恶龙

背景:
最近,北理工出现了一只恶龙,它长着很多头,而且还会吐火,它将会把北理工烧成废墟, 于是,校长下令召集全校所有勇士杀死这只恶龙。要杀死这只龙,必须把它所有的头都砍掉,每个勇士只能砍一个龙头,龙的每个头大小都不一样,一个勇士只有在身高不小于龙头的直径的情况下才能砍下它。而且勇士们要求,砍下一个龙头必须得到和自己身高厘米数一样的学分。校长想花 最少的学分数杀死恶龙,于是找到你寻求帮助。

输入:
第一行 龙头数 n , 勇士人数 m ( 1<=n, m<=100 ) 接下来 n 行,每行包含一个整数,表示龙头的直径 接下来 m 行,每行包含一个整数,表示勇士的身高 l

输出:
如果勇士们能完成任务,输出校长需要花的最小费用;否则输 出 “ bit is doomed! ”
————————————————

代码实现

自学了一个多月的Java了,同学发了我他们学校的C语言题目,感觉有趣,就试了一下,花了不少时间,自己还查了一些代码,比如nextInt的实现,最后删删改改才完成这个拙劣的程序,程序运行应该没什么问题,就是没有输入保护,多输入数字不会影响程序进程,但是会占用内存,混淆视听,不过问题也不大,以下是代码了:

package com.kuang.test;

import java.util.Arrays;
import java.util.Scanner;

public class test01EvilDragon {
    public static void main(String[] args) {
       System.out.print("请输入龙头数n,勇士数m,中间用一个空格隔开,最后以回车结束:");
      Scanner scanner1=new Scanner(System.in);      //读取键盘输入的数字
      int[]array1=new int[2];
        for(int i=0;i<array1.length;i++) {
            array1[i] = scanner1.nextInt();
        }
        int n=array1[0];            //取龙头数为n,恶龙数为m
        int m=array1[1];
        System.out.println("龙头数为:"+n+"\t"+"勇士人数为:"+m);

        if (n>=1 && n<=100 && m>=1 && m<=100) {        //m,n均在1~100之间方执行命令
            Scanner scanner2 = new Scanner(System.in);
            int[] dragons = new int[n];
            for (int i = 0; i < dragons.length; i++) {
                dragons[i] = scanner2.nextInt();          //取恶龙数组为第二次输入的n个数字
            }
            System.out.println(Arrays.toString(dragons));

            Scanner scanner3 = new Scanner(System.in);
            int[] heros = new int[m];
            for (int i = 0; i < heros.length; i++) {
                heros[i] = scanner3.nextInt();           //取英雄数组为第二次输入的m个数字
            }
            System.out.println(Arrays.toString(heros));

            Arrays.sort(dragons);// 数组进行升序排序
            Arrays.sort(heros);// 数组进行升序排序
            System.out.println("龙头直径排序为:");
            System.out.println(Arrays.toString(dragons));
            System.out.println("勇士身高排序为:");
            System.out.println(Arrays.toString(heros));

            if (n <= m) {                    //每个英雄只能砍一个头,故英雄数不能少于恶龙数
                int count = 0; int k=0;
                for (int i = 0; i < dragons.length; i++) {
                    for (int j = k; j < heros.length; j++) {
                        if (dragons[i] <= heros[j]) {
                            count += heros[j];
                            n--;
                            k=j+1;  //用k作循环为了方便定位第一个能看下恶龙的英雄所在的数组下标
                            break;
                        }
                    }
                }
                if (count > 0 && n == 0) {
                    System.out.println("最少费用:" + count);
                } else {
                    System.out.println("bit is boomed!");
                }
            } else {
                System.out.println("bit is boomed!");
            }
        }else{
            System.out.println("bit is boomed!");
        }

    }

}

说一下感受:首先思路很明确,读取三个输入的数组,第一个数组取出来m和n,第二个恶龙头直径数组,第三个英雄身高数组;排序恶龙数组和英雄数组,循环遍历比较恶龙头的直径和英雄的身高,核心算法部分要注意在外层循环恶龙之后,内层循环英雄时如何定位到第一个砍头的英雄(很关键,因为每个英雄只能砍一次),我这里在同学的提醒下,取得变量k,嵌入到内层循环里面;之前还想到每次用一个英雄,就把英雄身高赋值为0,此题也可以得解,但是原始数据变了,生产环境中肯定不允许;此文章只做为学习记录,不作为讲解,如果有伙伴们有更好的方法,欢迎分享给我,我是菜鸟,给我长点见识吧哈哈~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值