HDU 1257

题意:求拦截住所有导弹所需要的最少的拦截系统。

思路:贪心大法(or DP)。之前的思路有误:想的是每次遇到一个比当前拦截系统的高度要高的导弹时,就重新开一个拦截系统。这并没有完全利用拦截系统。正确的思路:保存下所有拦截系统当前所能发射的最高高度,当遇到一个导弹时,选择距离它高度最近的拦截系统去拦截!从前往后扫就保证了这一点。

AC代码:

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
	int n,x;
	int dp[1000],m;
	while(scanf("%d",&n)!=EOF)
	{
	 m=0;
	 dp[1]=0;
	 for(int i=1;i<=n;i++)
	 {
	  scanf("%d",&x);
	  int j;
	  for(j=1;j<=m;j++)
	  {
	   if(x<dp[j])
	   {
	    dp[j]=x;
	    break;
	   }
	  }
	  if(j>m)
	  dp[++m]=x;
	 }
	 printf("%d\n",m);
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 21:14:55

HDU 1257的相关文章

[2016-03-27][HDU][1257][最少拦截系统]

时间:2016-03-27 14:51:35 星期日 题目编号:[2016-03-27][HDU][1257][最少拦截系统] 分析:贪心,每当不能拦截就增加一个拦截系统,可以发现,每个拦截系统拦截的高度比较和出现的顺序一样.即第二个系统始终比第一个系统拦截的高度高 #include <cstdio> using namespace std; int a[30000 + 10]; int main(){ int n,b,flg; while(~scanf("%d",&

HDU 1257——最少拦截系统——————【LIS变型题】

最少拦截系统 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1257 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有

HDU 1257 最少拦截系统(Dilworth定理+LIS)

最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 35053    Accepted Submission(s): 13880 Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的

I - 最少拦截系统 HDU 1257

I - 最少拦截系统 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1257 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能

poj 1065 Wooden Sticks / hdu 1257 最少拦截系统 DP 贪心

参考链接:http://blog.csdn.net/xiaohuan1991/article/details/6956629 (HDU 1257 解题思路一样就不继续讲解) POJ 1065题意:给你n个木块,分别给出其长度和重量,然后要对这些木块进行加工,如果木块1的长度和重量都不大于木块2, 那么这两个木块可以放在一起加工,从而只用花费1个时间单位.问要如何进行加工从而能够花费最少时间单位. 知识点: 偏序集:若一个集合A为偏序集,那么满足:1.任意一个元素X属于集合,那么这个元素X≤X 2

HDU 1257 最少拦截系统

http://acm.hdu.edu.cn/showproblem.php? pid=1257 题目大意: 有一种导弹拦截系统,每次仅仅能发射比前一发导弹低的炮弹,给定一些导弹的突击顺序,求至少须要多少导弹拦截系统来全然阻止 思路: 好久没做题.做题水的~ 直接模拟就可以~ #include<cstdio> const int MAXN = 30000 + 10; const int INF = 0x3ffffff; int a[MAXN], ans; int cur_max[MAXN]; /

hdu 1257 &amp;&amp; hdu 1789(简单DP或贪心)

第一题;http://acm.hdu.edu.cn/showproblem.php?pid=1257 贪心与dp傻傻分不清楚,把每一个系统的最小值存起来比较 1 #include<cstdio> 2 using namespace std; 3 int a[30001],b[30001]; 4 int main() 5 { 6 int n,i,j; 7 while (~scanf("%d",&n)) 8 { 9 int ans=0; 10 b[0]=-1; 11 f

HDU 1257 最少拦截系统(最长递减子序列的条数)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 题解: 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 5 const int maxn = 1000 + 10; 6 7 int dp[maxn],arr[maxn]; 8 int n; 9 10 int main() { 11 while (scanf("%d", &

HDU 1257 最少拦截系统 简单DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257 题目大意:求有多少个单调非递增序列. 解题思路:经典题的变形----LIS.可以按照题意,多次dp,每次记录路径并进行访问标记,每次dp只要有更新过就++ans. 然而稍微思考就发现实际上求得就是最长单调递增序列的长度. 代码: const int maxn = 1e6 + 5; int n, a[maxn]; int dp[maxn]; void solve(){ memset(dp, 0,

HDU - 1257 最少拦截系统(dp或贪心)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257 题意:中文题 题解: 1.dp:题目问最少有几个最长递减子序列,反过来想就是求这个序列中的最长递增子序列的长度为多少. 其实就是变化点造成出现新的序列,然后把变化点放在一起就是最长递增序列啦. 然后就是一道简单的LIS了. 1 //hdu1257 2 //状态转移方程: dp[i]=max(dp[i],dp[j]+1); 3 #include <iostream> 4 #include &l