题目: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. C#的Response.BinaryWrite图片乱码问题

    今天学习Response对象,该对象的有很多的输出方式,其中有一个binaryWrite可以输出图片,但是在输出图片一开始出现了乱码,后来通过百度得到解决: 代码: FileStream stream ...

  2. VFS dup ,dup2

    Linux支持各种各样的文件系统格式,如ext2.ext3.reiserfs.FAT.NTFS.iso9660等等,不同的磁盘分区.光盘或其它存储设备都有不同的文件系统格式,然而这些文件系统都可以mo ...

  3. css3的counter的用法

    很早之前,计数器仅存在于ul,ol等元素中,如何想给其他元素增加计数,就只能通过list-style-image,或者background-image来实现.不过现在css3增加了counter属性, ...

  4. 详细介绍弹性盒模型(display:flex)

    弹性盒模型,即Flexbox,是css3中的新特性,其实弹性盒模型的原身是dispaly:box:这里,我们暂时不考虑旧的,我们只看新的. 为容器指定弹性盒子,只需在父元素(也就是容器)中设置:dis ...

  5. Google Play sign sha1 转 Facebook login 需要的 hashkey

    :4E:::::3A:1F::A6:0F:F6:A1:C2::E5::::2E | xxd -r -p | openssl base64 输出 M05IhBlQOh9jpg/2ocIx5QE4VS4= ...

  6. Delphi组件开发教程指南目录

    用Delphi开发的时间也不短了!刚接触Delphi的时候,就觉得组件这个东西非常方便!根本不必知道组件内部的作为,只要使用就好了!然而用的多了,也不免会对各种delphi组件的内部实现方式产生兴趣! ...

  7. maven release版本重复上传error

    A couple things I can think of: user credentials are wrong url to server is wrong user does not have ...

  8. SPOJ Repeats(后缀数组+RMQ-ST)

    REPEATS - Repeats no tags  A string s is called an (k,l)-repeat if s is obtained by concatenating k& ...

  9. ARC076 F Exhausted? Hall定理 + 线段树扫描线

    ---题面--- 题目大意: 有n个人,m个座位,每个人可以匹配的座位是[1, li] || [ri, m],可能有人不需要匹配座位(默认满足),问最少有多少人不能被满足. 题解: 首先可以看出这是一 ...

  10. hdu4035 Maze 【期望dp + 数学】

    题目链接 BZOJ4035 题解 神题啊...orz 不过网上题解好难看,数学推导不写\(Latex\)怎么看..[Latex中毒晚期] 我们由题当然能很快写出\(dp\)方程 设\(f[i]\)表示 ...