92分求助,真不知道我这LIS究竟写错在哪了。。。ORZ
查看原帖
92分求助,真不知道我这LIS究竟写错在哪了。。。ORZ
277102
Reimilia楼主2020/11/3 08:38
#include <iostream>

using namespace std;
const int MAXN = 100000 + 5;
int num[MAXN],dp[MAXN],dp2[MAXN];

//question : longest increasing sequence->longest decreasing sequence
//example : 389 207 155 300 299 170 158 65
//solution : 389 300 299 170 158 65

//example : 89 126 85 103 101 86 86 98 96 99 89 81 101 92 79 77 82 97 83 100 78 72 79 97 71 80 98 89 69 74
//solution : 12 6

int main()
{
	int n=0,x;
	while(scanf("%d",&x)!=EOF) {
		num[n++]=x;
	}
	
	int len=0,len2=0;
	dp[0]=0x3fffffff;
	dp2[0]=0;
	for(int i=0; i<n; i++) {
		//计算最多能拦截多少导弹 
		if(num[i]<=dp[len])dp[++len]=num[i];
		else {
			int L=0,R=len;
			while(L<R) {
				int mid=(L+R)/2;
				if(dp[mid]<num[i])R=mid;
				else L=mid+1;
			}
			dp[R]=max(dp[R],num[i]);
		}
		//计算这套导弹系统最少要几个 
		if(num[i]>dp2[len2])dp2[++len2]=num[i];
		else {
			int L=0,R=len2;
			while(L<R) {
				int mid=(L+R)/2;
				if(dp2[mid]>num[i])R=mid;
				else L=mid+1;
			}
			dp2[L]=min(dp2[L],num[i]);
		}
	}
	cout<<len<<endl<<len2<<endl;
	return 0;
}
2020/11/3 08:38
加载中...