首页 > 其他分享 >拦截导弹

拦截导弹

时间:2023-09-29 13:34:29浏览次数:19  
标签:拦截导弹 int 高度 导弹 num 序列 include

题目概述:有一套导弹拦截系统,其每次可以拦截的导弹高度都不能高于上一次拦截导弹的高度。现在有一些导弹飞来,问这套系统最多能够拦截多少导弹,若想拦截所有的导弹,最少需要多少套系统。
解题思路:第一问就是典型的LIS模型。第二问的关键在于将某枚导弹归为哪一类下降子序列,从而使得使用的系统最少。这里直接给出贪心的结论和一个简单的证明:假设现在有k个下降子序列,将该枚导弹归为序列的结尾导弹高度不低于该枚导弹差值最小的下降序列最优。因为这样做可以使废弃的高度最小。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <set>
#include <vector>
#include <map>
#include <set>

using namespace std;

typedef long long LL;
typedef pair<int,int>PII;
const int N = 5010;

int num[N];
int g[N];//存储每个序列结尾导弹的高度
int dp[N];
int n;

void solve(){
	//输入导弹高度
	while(cin >> num[n])n++;

	int m = n;
	int ans = 0;

	int re = 0;
	for(int i = n - 1; i >= 0; i --){
		dp[i] = 1;
		for(int j = n - 1; j > i; j --){
			if(num[j] <= num[i])dp[i] = max(dp[i],dp[j] + 1);
		}
		re = max(re,dp[i]);
	}

	cout << re << endl;
	
	for(int i = 0; i < n; i ++){
	    int k = 0;
	    while(k < ans && g[k] < num[i])k++;
	    if(k == ans)g[ans++] = num[i];
	    else g[k] = num[i];
	}
	
	cout << ans << endl;
	
}

int main(){
	int T = 1;

	while(T --){
		solve();
	}
	
}

标签:拦截导弹,int,高度,导弹,num,序列,include
From: https://www.cnblogs.com/dengch/p/17736936.html

相关文章

  • 5.拦截导弹问题
    【题目】某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统,但是这种拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由于该系统还在试用阶段。所以一套系统有可能不能拦截所有的导弹。输入导......
  • 1010. 拦截导弹
    某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。......
  • P2487 拦截导弹 题解
    拦截导弹题目大意给定若干元素,每个元素有\(3\)个属性\(t_i,h_i,v_i\),求出一个使得对于\(\foralli,j,i>j\),\(t_i>t_j,h_i\leh_j,v_i\lev_j\)均成立的最长的子序列\(a\)的长度。并计算每个元素在所有的可能的\(a\)方案中的出现概率。思路分析先看第一个问题:按\(......
  • 拦截导弹
    拦截导弹贪心策略如下所示:图一表示具体做法,图二表示证明上图的证明是指,如果最优解和贪心存在第一个地方不一样,那么因为\(a\)是\(\gex\)的最小数,所以\(b\gea\),所以这两段是可以互换的,所以最优解是可以变成贪心的。性质,\(g\)数组单调不降,证明如上图。我们可以惊奇的......
  • #yyds干货盘点# 动态规划专题:拦截导弹
    1.简述:描述某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发......