码迷,mamicode.com
首页 > 其他好文 > 详细

游戏之消除(最长递增序列)

时间:2019-08-07 22:23:42      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:clu   一起   namespace   print   getc   char   思路   输入数据   序列   

描述

 

 

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 }
View Code

 

游戏之消除(最长递增序列)

标签:clu   一起   namespace   print   getc   char   思路   输入数据   序列   

原文地址:https://www.cnblogs.com/qq-1585047819/p/11317972.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!