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

1010. 拦截导弹

时间:2023-07-01 11:55:12浏览次数:41  
标签:拦截导弹 队列 元素 高度 导弹 序列 拦截 1010

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。

但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。

某天,雷达捕捉到敌国的导弹来袭。

由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,导弹数不超过1000),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

输入格式

共一行,输入导弹依次飞来的高度。

输出格式

第一行包含一个整数,表示最多能拦截的导弹数。

第二行包含一个整数,表示要拦截所有导弹最少要配备的系统数。

数据范围

雷达给出的高度数据是不大于 30000 的正整数,导弹数不超过 1000。

输入样例:

389 207 155 300 299 170 158 65

输出样例:

6
2

题解

NOIP很经典的一道题,共有两问,两问之间并无太大联系,完全可以当作两个题做。

第一问是经典的最长上升子序列模型,只不过这里需要求最长不下降子序列,按照题意去套板子就可以了,复杂度是n方。

第二问就是一个典型的贪心,在这里简单证明一下:

假设我们先把该队列按照题意分为k个队列,如果某一组的最低高度(也就是队尾元素)高于另一队列的最高高度(队首元素),那么这两个队列应该合并,结果k与题意不符;由上一点我们可以知道,如果a序列的队尾元素,大于b序列内的任意一个元素,那么也能将该元素到其队尾全部合并到a序列中,不会改变结果。

因此,我们的贪心思路是先遍历整个序列,把所有能加入的元素加入队列组成一个不下降序列,然后删去这些元素,对答案加一;重复该步骤直到队列中没有元素。

代码

#include <bits/stdc++.h>
#define ll long long
#define PII pair<int,int> 
using namespace std;

const int N=1005;
int dp[N],a[N];
void solve()
{
	int n=0;
	do{
		n++;
	}while(cin>>a[n]);
	n--;
	for(int i=1;i<=n;i++)
	{
		dp[i]=1;
		for(int j=1;j<i;j++)
		{
			if(a[i]<=a[j]) dp[i]=max(dp[i],dp[j]+1);
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		ans=max(ans,dp[i]);
		dp[i]=0;
	}
	cout<<ans<<endl;
	ans=0;
	while(1)
	{
		int x=-1;
		for(int i=1;i<=n;i++)
		{
			if(dp[i]==0)
			{
				if(x<0)
				{
					dp[i]=1;
					x=a[i];
				}
				else 
					if(x>=a[i]){
						dp[i]=1;
						x=a[i];
					}
			}
		}
		if(x==-1) break;
		ans++;
	}
	cout<<ans;
}
int main()
{
	int T=1;
	//cin>>T; 
	while(T--)
	{
		solve();
	}
	return 0;
}

 

标签:拦截导弹,队列,元素,高度,导弹,序列,拦截,1010
From: https://www.cnblogs.com/zack-ze-kun/p/17519078.html

相关文章

  • 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\)数组单调不降,证明如上图。我们可以惊奇的......
  • hdu 5446 长春区域赛网络赛1010 Unknown Treasure(lucas定理+中国剩余定理+移位乘法)
    题目链接:hdu5446题目大意:求出Cmn%M,M=p1⋅p2⋯pk题目分析:首先对于每个质数pi我们,我们可以利用Lucas定理求出Cmn%pi的值,Lucas定理如下:Cmn%p=Cm/pn/p⋅Cm%pn%p%p然后我们可以利用中国剩余定理求取最后答案:M=∏i=1kpi,Mi=M/piCmn%M=∑i=1kCmn%pi⋅Mi⋅inv[Mi]因为做乘法......
  • 360看图 1.0.0.1010 精简优化版
    修改历史:2023.03.30:自改官方 1.0.0.1010最新正式版本2023.03.20:首个自改官方1.0.0.1002修改内容:基于官方最新版本制作,精简部分非必要文件;禁止软件自动更新;去除所有程序自校验,避免程序报错;其他细节调整下载链接: 自用资源,暂不公开!......
  • 01010 键盘录入
    键盘录入scanner类​ 用于接收键盘输入的数字scanner的使用方法导包importjava.util.Scanner;//导包的动作必须写在类定义的上边创建对象Scannersc=newScanner(System.in);//只有sc是可以改变的变量名,其他都不可以改变接收数据inti=sc.nextInt();//左边这个格......
  • [pat乙]1010 一元多项式求导
    1010 一元多项式求导(25)设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为n*xn-1。)输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000......
  • hdu-1010
    简单深搜剪枝http://acm.hdu.edu.cn/showproblem.php?pid=1010#include<iostream>#include<algorithm>#include<set>#include<map>#include<string.h>#inc......
  • pat1010
    题不难,但是代码有一个结果报错,猜测可能如果输入0000234的话,可能会输出-1?先标记一下看看别人的#include<iostream>#include<stdio.h>usingnamespacestd;intmain(......
  • #10108. 「一本通 3.7 练习 2」Ant Trip
     无向图一笔画需要多少次(欧拉路径的条数)  答案:奇数点的个数/2 这题需要维护联通块,用并查集即可 #include<iostream>#include<algorithm>#include<cstri......
  • #10105. 「一本通 3.7 例 1」欧拉回路
     求欧拉回路(dfs) #include<bits/stdc++.h>usingnamespacestd;constintN=1e6+3,M=2e6+3;inlineintread(){intres=0,flag=1;ch......