拦截导弹
拦截导弹
贪心策略如下所示:图一表示具体做法,图二表示证明
上图的证明是指,如果最优解和贪心存在第一个地方不一样,那么因为
性质,
我们可以惊奇的发现,这个步骤和 896. 最长上升子序列 II 的做法一致,所以就可以用那道题的做法;这道题其实是可以用二分优化的。
#include<bits/stdc++.h>
using namespace std;
int n,x,i,j,d[500001],ans,mid,a[500001],b[500001];
int main(){
while(cin>>a[++n]);
n--;
for(i=n;i>=1;i--)
b[i]=a[n-i+1];
for(i=1;i<=n;i++){
if(b[i]>=d[ans])
d[++ans]=b[i];
else{
mid=upper_bound(d+1,d+1+ans,b[i])-d;
d[mid]=b[i];
}
}
cout<<ans<<endl;
ans=0;
for(i=1;i<=n;i++){
if(a[i]>d[ans])
d[++ans]=a[i];
else{
mid=lower_bound(d+1,d+1+ans,a[i])-d;
d[mid]=a[i];
}
}
cout<<ans;
return 0;
}
本文作者:wscqwq
本文链接:https://www.cnblogs.com/wscqwq/p/17416716.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步