Codeforces Round #555 (Div. 3) C2. Increasing Subsequence (hard version)【模拟】

一 题面

  C2. Increasing Subsequence (hard version)

二 分析

  需要思考清楚再写的一个题目,不能一看题目就上手,容易写错。

  分以下几种情况:

  1 左右两端数都小于等于构造的数组的最后一个数字

  2 左右两端数至少有一个大于构造的数组最后一个数字

    a. 左右两端数字相等,肯定满足上面条件。那么只可能走一个方向,两边都模拟一下,比一下大小即可

    b. 左右两端数字不等,则优先看谁满足上面2的情况,若都满足则选最小的

三 AC代码

  1 #include <bits/stdc++.h>
  2 
  3 using namespace std;
  4 
  5 const int MAXN = 2e5 + 15;
  6 int N, Data[MAXN];
  7 int Ans, ansOP[MAXN];
  8 
  9 int fun_l(int L, int R, int tmp)
 10 {
 11     int res = 0;
 12     while(Data[L] > tmp && L <= R)
 13     {
 14         res++;
 15         tmp = Data[L++];
 16     }
 17     return res;
 18 }
 19 
 20 int fun_r(int L, int R, int tmp)
 21 {
 22     int res = 0;
 23     while(Data[R] > tmp && R >= L)
 24     {
 25         res++;
 26         tmp = Data[R--];
 27     }
 28     return res;
 29 }
 30 
 31 void solve()
 32 {
 33     int L = 0, R = N - 1, tmp = 0;
 34     while(L <= R)
 35     {
 36         if( max(Data[L], Data[R]) <= tmp)
 37         {
 38             break;
 39         }
 40         if(Data[L] == Data[R])
 41         {
 42             int ansl = fun_l(L, R, tmp);
 43             int ansr = fun_r(L, R, tmp);
 44             if(ansl > ansr)
 45             {
 46                 for(int j = 0; j < ansl; j++)
 47                     ansOP[Ans++] = 0;
 48             }
 49             else
 50             {
 51                 for(int j = 0; j < ansr; j++)
 52                     ansOP[Ans++] = 1;
 53             }
 54             break;
 55         }
 56         else if(Data[L] < Data[R])
 57         {
 58             if(Data[L] > tmp)
 59             {
 60                 tmp = Data[L++];
 61                 ansOP[Ans++] = 0;
 62             }
 63             else
 64             {
 65                 tmp = Data[R--];
 66                 ansOP[Ans++] = 1;
 67             }
 68         }
 69         else
 70         {
 71             if(Data[R] > tmp)
 72             {
 73                 tmp = Data[R--];
 74                 ansOP[Ans++] = 1;
 75             }
 76             else
 77             {
 78                 tmp = Data[L++];
 79                 ansOP[Ans++] = 0;
 80             }
 81         }
 82     }
 83 }
 84 
 85 
 86 int main()
 87 {
 88     //freopen("input.txt", "r", stdin);
 89     while(~scanf("%d", &N))
 90     {
 91         for(int i = 0; i < N; i++)
 92             scanf("%d", &Data[i]);
 93         solve();
 94         printf("%d\n", Ans);
 95         for(int i = 0; i < Ans; i++)
 96         {
 97             if(ansOP[i] == 0)
 98                 printf("L");
 99             else
100                 printf("R");
101         }
102         printf("\n");
103     }
104     return 0;
105 }

 

转载于:https://www.cnblogs.com/dybala21/p/10779176.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值