【hdoj_1257】最小拦截系统
题目: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】最小拦截系统的更多相关文章
- HDU1257 最小拦截系统 【贪婪】
最小拦截系统 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- hdu dp 1257 最小拦截系统
最少拦截系统 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- HDU 1257(最小拦截系统)
Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不 能超过前一发的高度.某天,雷达 ...
- HDU-1257_最少拦截系统
最少拦截系统 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Desc ...
- HDU 1257 最少拦截系统【LIS】
题意:类似于套娃娃,问最少需要多少个拦截系统. 思路: 假设已经有m个导弹拦截序列 r1:x11>=x12>=x13>=...>=x1n r1:x21>=x22>= ...
- 【HDU1257】最少拦截系统(贪心)
最少拦截系统 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- HDU 1257 最少拦截系统 (DP || 贪心)
最少拦截系统 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- K - 最少拦截系统
Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不 能超过前一发的高度.某天,雷达 ...
- HDU1257-最少拦截系统
描述: 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来 ...
随机推荐
- 深入理解Java Web——Servlet
1.概述 狭义上看,是java的一个接口. 广义上看,任何直接或间接实现了Servlet接口的类. 2.核心对象 下面就是Servlet接口的内容: public abstract interface ...
- 算法(4) Rotate Image
题目:把一个N×N的矩阵旋转90° 思路:这个题目折腾了好长时间,确切地说是两个小时!这道题也反映出自己的逻辑比较混乱 这道题我到底卡在了哪里?自己已经在本子上画出了一个转移的关系 a[0][0] - ...
- springMVC笔记二
第十四章 springmvc快速入门(注解版本) 1)springmvc快速入门(传统版) 步一:创建springmvc-day02这么一个web应用 步二:导入springioc,springweb ...
- Spring 集成Quartz
在使用jdk的timer时发现无法在指定的日期进行执行任务.这便引入一个优秀的开源任务调度框架“quartz”.这里使用的是quartz-1.8.6版本.Quart的官网:http://www.qua ...
- HTML5表单提交与PHP环境搭建
PHP服务器使用xampp集成套件 路径 D:\xampp\htdocs\MyServer\index.php 访问 http://localhost/MyServer/index.php 能够正常显 ...
- hdu 3486 Interviewe (RMQ+二分)
Interviewe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- JS格式化时间(支持小程序,兼容IOS)
})-(\d{})-(\d{})T(\d{}):(\d{}):(\d{})/ /** * @function format time * @param val, format * @return {s ...
- tomcat内存配置及配置参数详解
1.jvm内存管理机制: 1)堆(Heap)和非堆(Non-heap)内存 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟 ...
- sublime2创建一个html5的snippets文件
背景:跟了一个网上课程,老师哗啦啦敲代码,屏幕上只敲了几个字,键盘一操作,瞬间一大溜代码,看得我心惊肉跳连忙暂停抄抄抄. 举个简单的例子,我需要创建一个html文件.但是我不想每次都敲固定的格式.那么 ...
- Spring 学习笔记(三)之注解
一.在classpath下扫描组件 •组件扫描(component scanning): Spring 能够从 classpath 下自动扫描, 侦测和实例化具有特定注解的组件. •特定组件包括: ...