chcod炸弹
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了chcod炸弹相关的知识,希望对你有一定的参考价值。
【题目描述】
话说Cpp国和Pas国发生了战争, Pas国派出了强大的飞机战队, Cpp国于是使出了炸弹CHCOD 来反击Pas国的飞机舰队。然而CHCOD的发射器,只能逐渐往上打。所以Cpp国现在只能打 掉一部分的Pas国飞机。现在给出每舰队一个Pas国飞机飞行高度,求Cpp国最多打掉Pas 国飞机数(如果高度< 0,则是钻地机,CHCOD炸弹打不到)
【输入格式】
第一行:n Pas国发出的飞机舰队飞机数量 第二行:n个数,Pas国飞机飞行高度。
【输出格式】
一个数:Cpp国最多打掉Pas国飞机数。
【分析】
简单的最长上升子序列,一般的做法O(n^2),这里明显会超时,所以我们就用一个O(n log n)的算法。
我们先设置一个stack栈,存储我们的序列,然后我们维护这个stack,每次用二分找出比top大的最小的数,然后替换就可以了。
【代码】
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 int n,top; 6 int a[100010],st[100010]; 7 8 int main() 9 { 10 scanf("%d",&n); 11 int cnt=0; 12 for(int i=1;i<=n;i++){ 13 int x; 14 scanf("%d",&x); 15 if(x>=0)a[++cnt]=x; 16 } 17 top=0; n=cnt; 18 for(int i=1;i<=n;i++){ 19 if(a[i]>st[top])st[++top]=a[i]; 20 else{ 21 int l=1,r=top; 22 while(l<r){ 23 int mid=(l+r)>>1; 24 if(st[mid]>a[i])r=mid; 25 else l=mid+1; 26 } 27 st[l]=a[i]; 28 } 29 } 30 printf("%d\n",top); 31 return 0; 32 }
以上是关于chcod炸弹的主要内容,如果未能解决你的问题,请参考以下文章