游戏之消除(最长递增序列)
Posted qq-1585047819
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了游戏之消除(最长递增序列)相关的知识,希望对你有一定的参考价值。
描述
zzx和city一直喜欢一起玩游戏,某一天zzx做了一个丧心病狂的消消乐游戏,游戏是这样的,zzx随机生成一个序列让city从前往后寻找5个数ai(1<=i<=5)如果5个数ai满足a1<a2<a3<a4<a5则可以消除这5个数,然而目前出现了一种情况,就是zzx和city不清楚这个序列还有没有可以消除的方案,所以想请你帮忙判断一下。
输入
输入数据有多组,输入到文件结束为止。
第一行输入一个N(106>=N>=5)。
第二行输入N个zzx随机生成的序列(在int32范围内的数字)。
输出
如果有可以消除的方案,输出YES,否则输出NO
样例输入
样例输出
解题思路:二分 替换
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 using namespace std; 6 7 int n; 8 const int N=1e6+5; 9 int dp[N],arr[N]; 10 int len; 11 12 //inline int read() 13 // int x=0,f=1; 14 // char ch=getchar(); 15 // while(ch<‘0‘||ch>‘9‘) 16 // if(ch==‘-‘) f=-1; 17 // ch=getchar(); 18 // 19 // while(ch>=‘0‘&&ch<=‘9‘) 20 // x=(x<<1)+(x<<3)+(ch^48); 21 // ch=getchar(); 22 // 23 // return x*f; 24 // 25 26 void Binary(int num) 27 int left=1,right=len; 28 int ans; 29 while(left<=right) 30 int mid=left+right>>1; 31 if(dp[mid]>=num) ans=mid,right=mid-1; 32 else left=mid+1; 33 34 dp[ans]=num; 35 36 37 int main() 38 while(scanf("%d",&n)!=EOF) 39 for(int i=1;i<=n;i++) scanf("%d",&arr[i]); 40 dp[1]=arr[1]; 41 len=1; 42 for(int i=2;i<=n;i++) 43 if(arr[i]>dp[len]) dp[++len]=arr[i]; 44 else 45 Binary(arr[i]); 46 47 48 if(len>=5) printf("YES\n"); 49 else printf("NO\n"); 50 51 return 0; 52
以上是关于游戏之消除(最长递增序列)的主要内容,如果未能解决你的问题,请参考以下文章