拦截导弹
题目描述
M-78星云上有丰富的矿产资源,而njn极想掠夺其资源,2月30日njn终于发动了对M-78星云的侵略战争。众多正义和平之士在jun的带领下来到M-78星云协助当地居民抵抗外来侵略。
由于njn对M-78星云的战争迟迟不能结束,所以,njn终于使出杀手锏:发射导弹,攻击M-78星云。幸好jun事先已在njn的军营中安插间谍pzy。pzy不负众望,终于秘密的获得了njn要发射的n个导弹的高度。
获的导弹机密后,jun又面临一个严峻的问题,由于M-78的军事设备落后,弹药紧缺。所以jun现有的导弹系统每次拦截的敌方导弹的飞行高度都不能高于上一次拦截的敌方导弹的飞行高度。
现在jun找到聪明的你,希望你能帮助其算出一次发射过程最多能击落敌方导弹数。
输入
文件中第一行只有一个整数n,表示njn入侵计算中拟发射的导弹总数,第二行中有n个整数h1,h2,h3……hn各数用空格隔开。分别表示各枚依次入侵的导弹的高度。已知它们的飞行高度不高于10^5。
输出
输出一枚导弹最多能击落敌方导弹数S.
样例输入
1 2 |
2 2 1 |
样例输出
1 |
2 |
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include<iostream> using namespace std; int n,i,ans,j,k,m,a[100001]={0},b[100001]={0}; int main() { cin>>n; for(i=1;i<=n;i++) cin>>a[n-i+1]; ans=0; for(i=1;i<=n;i++){ j=1;k=ans; while(j<=k){ m=(j+k)/2; if(b[m]<=a[i])j=m+1; else k=m-1; } if(j>ans)ans++; b[j]=a[i]; } cout<<ans; return 0; } |
Subscribe