58分求教,应该是第二问二分错误,有注释
查看原帖
58分求教,应该是第二问二分错误,有注释
1340302
jijianxiangsu楼主2024/8/20 23:45

二分一直不怎么会写,求大佬指点

#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";
	
	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";
}
2024/8/20 23:45
加载中...