【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的同步容器和并发容器
前言: 之前在介绍Java集合的时候说到,java提供的实现类很少是线程安全的.只有几个比较古老的类,比如Vector.Hashtable等是线程安全的,尤其是Hashtable,古老到连命名规范都没 ...
- [Elasticsearch] 多字段搜索 (二) - 最佳字段查询及其调优
最佳字段(Best Fields) 假设我们有一个让用户搜索博客文章的网站,就像这两份文档一样: PUT /my_index/my_type/1 { "title": " ...
- 【bzoj1260】[CQOI2007]涂色paint 区间dp
题目描述 给出一个序列,每次可以给一段染成同一种颜色,问最少要染多少次能够染成给定方案. 输入 输入仅一行,包含一个长度为n的字符串,即涂色目标.字符串中的每个字符都是一个大写字母,不同的字母代表不同 ...
- 【转】64位ORACLE客户端上plsql无法识别ORACLE_HOME解决方案
转自:http://www.2cto.com/database/201503/386267.html 中文显示问号 转自:http://zhidao.baidu.com/link?url=qJDmsa ...
- cf 442 D. Olya and Energy Drinks
cf 442 D. Olya and Energy Drinks(bfs) 题意: 给一张\(n \times m(n <= 1000,m <= 1000)\)的地图 给出一个起点和终点, ...
- CMD批处理把txt文本中的每行写入一个新文件,第一列作文件名
需求 现在有一个文件格式如图 ID 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17001 89.84 8.87 1.29 -0.0 0.0 68.99 0.0 0. ...
- 【BZOJ 2756】[SCOI2012]奇怪的游戏 二分+最大流
这道题提醒我,要有将棋盘黑白染色的意识,尤其是看到相邻格子这样的条件的时候,然后就是要用到与其有关的性质与特点以体现其作用,这道题就是用到了黑格子与白格子之间的关系进行的,其出发点是每次一定会给一个黑 ...
- shell脚本应用
解析乱的日志文件到临时文件中,然后用awk 1004 cd /usr/local 1005 ll 1006 cd pttmsg/ 1007 ll 1008 cd msgbin-2/ ...
- Array.slice(start,end)的用法
start在start>=0,假设start=0,表示从数组的第一个元素开始截取,start=2,表示从数组的第二个元素开始截取,依次类推. 在start<0时,start=-1表示从倒数 ...
- bzoj 2427 [HAOI2010]软件安装 Tarjan缩点+树形dp
[HAOI2010]软件安装 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2029 Solved: 811[Submit][Status][Dis ...