题目:http://acm.hdu.edu.cn/showproblem.php?pid=1257

可以这样理解题意:给出一组数字,给它们划分组数,划分的依据是,每一组的元素必须是单调递减的顺序,只有这样才能保证一个拦截系统能拦截本组的所有导弹,待求的是这样划分的最小组数.

方法一:直接模拟人工分组的过程

例如389 207 155 300 299 170 158 65的划分过程如下

首先,遍历一遍,389->207->155->65为第一组,再看剩余的.

其次,300->299->170->158为第二组.

最少需要2个拦截系统.

C++代码如下

#include<iostream>
#include<algorithm>
using namespace std; int main()
{
int n;
while(cin >> n)
{
int *a = new int[n];
for(int i=0;i<n;i++)
cin >> a[i];//输入数据
int result = 0;
for(int i=0;i<n;i++)//从头到尾,分别以每个元素作为起点,遍历一遍(也可以不这样,只要所有元素能得到分配即可)
{
if(a[i])//元素是否分配,开始数据均非0,是未分配的,到后面会陆续将它们设为0
{
int * IndexOfShouldBeZero = new int[n];//可以分配的元素的下标
int NumOfShouldBeZero = 0;//可以分配的元素的个数
IndexOfShouldBeZero[NumOfShouldBeZero++] = i;//如果可以进入这个if语句,表明原来是没有被分配的,所以现在可以分配了
result ++;//组数加1(元素i是本组的第一个元素)
for(int j=i+1;j<n;j++)//看看元素i之后的所有的、没有分配的 元素
{
if(a[j])//没有分配的
{
if(a[j]<a[IndexOfShouldBeZero[NumOfShouldBeZero-1]])//元素j可以分配,因为它比前一个元素小
{ //思考:前一个元素为什么不是a[j-1].这里要求是这一轮的前一个元素
IndexOfShouldBeZero[NumOfShouldBeZero++] = j;//记录下可以分配到改组的元素下标,以便后面将同一组中的元素统一退出系统
}
}
}
for(int k=0;k<NumOfShouldBeZero;k++)
{
a[IndexOfShouldBeZero[k]] = 0;//让处于同一个组中的元素退出系统,以后不(用)再 考虑它们
}
}
}
cout << result << endl;
} return 0;
}

上述代码提交AC.

方法二:换一种思路

参考:http://blog.csdn.net/dxx_111/article/details/48864239

将第一个导弹的高度设置为第一个拦截系统的值,之后遍历所有的导弹高度,遇到一个导弹,在已有的拦截系统中查找,看看已有的拦截系统能否拦截这个导弹.

如果能拦截,则拦截.并且将查找到的可以拦截这个导弹的拦截系统的值设置为该导弹的高度,为的是保证【递减】的要求.

如果不能,则只能添加新的拦截系统.并且新的拦截系统的值设置为该导弹的高度.

C++代码如下

#include<iostream>
#include<algorithm>
using namespace std; int main()
{
int n;
while(cin>>n)
{
int *a = new int[n];
int *H = new int[n];//最多需要n个拦截系统
int num = 0;
for(int i=0;i<n;i++)
{
cin >> a[i];
}
H[num++] = a[0];
for(int i=1;i<n;i++)
{
int ok = 0;
for(int j=0;j<num;j++)
{
if(a[i]<H[j]) //如果在已经有的拦截系统中,可以拦截导弹i,那么不用添加新的拦截系统
{
ok = 1;
H[j] = a[i];//并且将第一次找到的拦截系统的值设置为该导弹的高度,为的是,符合【递减】的要求
break;
}
}
if(ok==0)//否则,需要添加新的拦截系统,并且把新的拦截系统的值设置为该导弹的高度
{
H[num++] = a[i];
}
}
cout << num << endl;
} return 0;
}

上述代码提交AC.

方法三:动态规划

参考:http://www.cnblogs.com/dongsheng/archive/2012/07/23/2604777.html

【hdoj_1257】最小拦截系统的更多相关文章

  1. HDU1257 最小拦截系统 【贪婪】

    最小拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  2. hdu dp 1257 最小拦截系统

    最少拦截系统 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  3. HDU 1257(最小拦截系统)

    Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不 能超过前一发的高度.某天,雷达 ...

  4. HDU-1257_最少拦截系统

    最少拦截系统 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Desc ...

  5. HDU 1257 最少拦截系统【LIS】

    题意:类似于套娃娃,问最少需要多少个拦截系统. 思路: 假设已经有m个导弹拦截序列 r1:x11>=x12>=x13>=...>=x1n r1:x21>=x22>= ...

  6. 【HDU1257】最少拦截系统(贪心)

    最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  7. HDU 1257 最少拦截系统 (DP || 贪心)

    最少拦截系统 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  8. K - 最少拦截系统

    Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不 能超过前一发的高度.某天,雷达 ...

  9. HDU1257-最少拦截系统

    描述: 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来 ...

随机推荐

  1. Visual Studio 2012,创建工程Build Driver,基于纯Source Code.

    拿到一堆纯代码,怎么去Create Project,设置Include路径,lib路径,要不要Pre-compile技术,配置Project之间的依赖关系. SourcesConverter  Bas ...

  2. CF840C On the Bench 解题报告

    CF840C On the Bench 题意翻译 给定\(n\) \((1≤n≤300)\) 个数,求问有多少种排列方案使得任意两个相邻的数之积都不是完全平方数.由于方案数可能很大,输出方案数 \(m ...

  3. Small things are better

    Yesterday I had fun time repairing 1.5Tb ext3 partition, containing many millions of files. Of cours ...

  4. Avito Cool Challenge 2018 A. B题解

    A. Definite Game 题目链接:https://codeforces.com/contest/1081/problem/A 题意: 给出一个数v,然后让你可以重复多次减去一个数d,满足v% ...

  5. Codeforces Round #487 (Div. 2) A Mist of Florescence (暴力构造)

    C. A Mist of Florescence time limit per test 1 second memory limit per test 256 megabytes input stan ...

  6. Java中Class<T>与Class<?>的区别

    E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number(数值类型) ? - 表示不确定 ...

  7. html与地图

    html:<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <meta ...

  8. 使用vs2010编辑Unity脚本,配置方法

    在Unity界面上.选择Edit->Preferences->External Tools,External Script Editor一项即为编译器. 以Unity3D 4.3.4 f1 ...

  9. abstract 与interface区别

    1.abstract用于修饰类,interface用于修饰接口 2.抽象类中可以有抽象和非抽象方法,接口中只能定义抽象方法,不能有实现 3.抽象类必须被继承,interface被实现 4.抽象类有构造 ...

  10. WIN8.1优化

    用WIN8.1至今,总结的所有优化的办法! 从Win7.Win8.1开始,微软为我们带来完善的系统服务.任务计划程序,这些都一定程度提升了日常使用,实现了“半自动化.半智能化”交互体验.但是对于高级用 ...