HDU1257(贪心,经典)
原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=1257
题意
中文题目,自己看
思路
典型的贪心,虽然也可以用DP来做,但本着能简单则简单的做法,还是用了贪心。
我们开辟一个数组,用于保存所有拦截系统所能拦截的最大高度。
对于每一枚导弹,我们都去访问这个数组,看有没有哪一套系统可以拦截该导弹,如果有则选取最优的那个,何谓最优,就是该拦截系统能拦截的导弹的高度大于等于该枚导弹的高度,同时比其它所有的拦截系统当前所能拦截的导弹的高度都要低;而如果没有一套系统可以拦截,则在数组中新架设一个拦截系统,将初值设为该枚导弹的高度即可。
AC代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
/**
* Created with IntelliJ IDEA.
*
* @author wanyu
* @Date: 2018-02-15
* @Time: 17:00
* To change this template use File | Settings | File Templates.
* @desc
*/
public class Main {
public static void main(String[] args) throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
while (in.nextToken() != StreamTokenizer.TT_EOF) {
int n = (int) in.nval;
int[] missile = new int[n];//导弹
for (int i = 0; i < n; i++) {
in.nextToken();
missile[i] = (int) in.nval;
}
int[] system = new int[n];//拦截系统
int len = 0;//拦截系统的数量
for (int i = 0; i < n; i++) {//第几个导弹
int index = -1;//使用第几套系统拦截
if (len == 0)
system[len++] = missile[i];
else {
for (int j = 0; j < len; j++) {//访问第几套拦截系统
if (system[j] >= missile[i]) {//可以拦截,从所有可以拦截的系统中选择最优的那套系统
//所谓最优的就是大于等于该枚导弹的高度,同时比其它所有的拦截系统当前所能拦截的导弹的高度都要低。
if (index == -1) {
index = j;
} else {
if (system[j] < system[index])
index = j;
}
}
}
if (index == -1) {
//没有一套系统可以拦截
system[len++] = missile[i];//新开一个系统
} else {
system[index] = missile[i];//否则更新拦截大那套系统的值
}
}
}
System.out.println(len);
}
}
}