北理工的恶龙
背景:
最近,北理工出现了一只恶龙,它长着很多头,而且还会吐火,它将会把北理工烧成废墟, 于是,校长下令召集全校所有勇士杀死这只恶龙。要杀死这只龙,必须把它所有的头都砍掉,每个勇士只能砍一个龙头,龙的每个头大小都不一样,一个勇士只有在身高不小于龙头的直径的情况下才能砍下它。而且勇士们要求,砍下一个龙头必须得到和自己身高厘米数一样的学分。校长想花 最少的学分数杀死恶龙,于是找到你寻求帮助。
输入:
第一行 龙头数 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,此题也可以得解,但是原始数据变了,生产环境中肯定不允许;此文章只做为学习记录,不作为讲解,如果有伙伴们有更好的方法,欢迎分享给我,我是菜鸟,给我长点见识吧哈哈~