zoukankan      html  css  js  c++  java
  • 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
    ", 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("
    ");
    103     }
    104     return 0;
    105 }
  • 相关阅读:
    两个泛型实例之间的属性变化
    C#
    字符编码
    如何在阿里云 CentOS 8 / RHEL 8 上安装 vsftpd(ftp 服务器)
    使用 ASP.NET Core 创建 Web API使用 JavaScript 调用报错 webapi Unable to get items. TypeError: Failed to fetch
    让WPF程序启动时以管理员身份运行(转载)
    WPF任务栏同步进度
    C# ref and out
    C# 中 string.Empty、""、null的差别
    如何读写拥有命名空间xmlns 属性的Xml文件(C#实现)
  • 原文地址:https://www.cnblogs.com/dybala21/p/10779176.html
Copyright © 2011-2022 走看看