下面的是我写的第二问二分函数,
void f(int n){//n是当前要拦截的导弹高度
cout<<n<<"\n";
int l=1,r=s;
int mid;
while(l<=r){
mid=(l+r)/2;
//cout<<l<<" "<<mid<<" "<<r<<"\n";
if(x[mid]>n) r=mid-1;
else l=mid+1;
//getchar();
}
x[mid]=n;//拦截系统高度数组更新
if(mid==s) mx=n;//mx最大高度
}
求大佬解答,谢谢!
其他代码应该没有错,也附上吧 58分QWQ
#include<bits/stdc++.h>
using namespace std;
int p[100005];
int x[100005];
int s=0;//系统数
int mx=0;//最高可拦截的高度
int ss[100005];
void f(int n){
cout<<n<<"\n";
int l=1,r=s;
int mid;
while(l<=r){
mid=(l+r)/2;
cout<<l<<" "<<mid<<" "<<r<<"\n";
if(x[mid]>n) r=mid-1;
else l=mid+1;
//getchar();
}
x[mid]=n;
if(mid==s) mx=n;
}
int main(){
int sum=0;
int n;
while(cin>>n){
sum++;
p[sum]=n;
}
//for(int i=1;i<=sum;i++)cout<<p[i]<<" ";
//cout<<"\n";
// int s=0;//系统数
// int mx=0;//最高可拦截的高度
for(int i=1;i<=sum;i++){
if(mx<p[i]){
s++;
x[s]=p[i];
mx=p[i];
}
else{
f(p[i]);
}
//cout<<p[i]<<" "<<s<<" "<<mx<<"\n";
//for(int j=1;j<=s;j++)cout<<x[j]<<" ";
//cout<<"\n";
}
ss[sum]=1;
for(int i=sum-1;i>=1;i--){
ss[i]=1;
for(int j=i+1;j<=sum;j++){
if(p[i]>=p[j])ss[i]=max(ss[i],ss[j]+1);
}
}
//for(int i=1;i<=sum;i++)cout<<ss[i]<<" ";
//cout<<"\n";
sort(ss+1,ss+1+sum);
cout<<ss[sum]<<"\n";
cout<<s<<"\n";
}