zoukankan      html  css  js  c++  java
  • FZU Monthly-201901 tutorial

    FZU Monthly-201901 tutorial

    题目(难度递增) easy easy-medium medium medium-hard hard
    思维难度 AHG F B CE D
    编码难度 AH CEFG B D

    A. RonTanYoYiSen

    对于本题,你只需要FOR一遍判断是不是回文串即可。不管一个字符串是不是回文串,只有将它反过来再写一边就可以构造出一个回文串。根据题意,如果是回文串则输出“YES NO”,否则输出“NO YES”。

    复杂度(O(N))

    B. max position set

    Tutorial 1. Bruce force

    由于是字典序的缘故,所以我们从第一列开始看到最后一列,如果当前列选择后,不会违背字典序,那么根据贪心思想这一列要,否则显然不能取。这样做 (N) 次,每次把新的一列加到前面选出来的字符串后面,check一下是否合法。总复杂度 (O(N^3))

    例子:

    adc
    bcd
    加进第一列
    a
    b
    合法,保留。加入第二列
    ad
    bc
    不合法,撤销。加入第三列
    ac
    bd
    合法,保留。
    

    Tutorial 2. Observe

    观察可以发现,每加入一列后,如果第 (i) 行的字典序小于第 (i+1) 行,那么之后怎么怎么加都不会再对着这两行有影响,即:整个过程中需要考虑的一定是相邻的且所有字符均一样的字符串。所以标记一下 (N-1) 个相邻关系中国哪些已经出现偏序,那些还没有,不需要考虑前面的取的字符,只需要比较当前新加进的这一列即可(因为前面一定是一样的)

    这样还是做 (N) 次,每次比较只花 (O(N)) 的时间,总复杂度 (O(N^2))

    C.Palindrome

    画图把相同的字符连线会发现就只有4种情况,然后分类讨论一下

    • m1:当m1时,任意长度为1的子串显然都是回文串,所以答案是 (k^n)

    • m > n:与m==1情况是一样的

    • m==n:这个时候只需要考虑前半部分,这时候答案分别是 (k^{n/2})(n为偶数),(k^{n/2+1})(n为奇数)

    • m < n: 当m为奇数,答案为(k^2),当m为偶数,答案为(k)

    注:m > n 的时候,显然怎么构造都满足题意

    复杂度为(O(N))

    D. special square

    同样的题目背景,经典题型是求面积最大的全1矩阵。先学习一下这道题的做法,关于这道题,演算法笔记上有非常详尽的分析:http://www.csie.ntnu.edu.tw/~u91029/MaximumSubarray.html#2

    这题的做法基本与那道经典题类似,一样的按行or列枚举,通过单调栈去check,核心就是满足条件的矩形四条边都要顶到障碍物,代码基本与原经典题类似,理解原经典题后如还有细节有疑惑可见代码。

    复杂度为(O(N^2))

    //
    //  solution.cpp
    //  special-matrix
    //
    //  Created by 郑浩晖 on 2018/12/19.
    //  Copyright © 2018 郑浩晖. All rights reserved.
    //
    
    #include <bits/stdc++.h>
    using namespace std;
    #define fi first
    #define se second
    #define sz(x) ((int)(x).size())
    #define dd(x) cout << #x << " = " << (x) << ", "
    #define de(x) cout << #x << " = " << (x) << endl
    typedef pair<int, int> pii;
    
    const int N = 5e3 + 7;
    char s[N][N];
    int n, m, up[N][N];
    void solve()
    {
        cin >> n >> m; m++;
        for (int i = 0; i < n; i++) { scanf("%s", s[i]);  s[i][m-1] = '0'; }
        for (int i = 0; i < m; i++) s[n][i]='0';
        for (int j = 0; j < m; j++) up[0][j] = s[0][j] == '1';
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < m; j++) {
                up[i][j] = s[i][j] == '1' ? up[i - 1][j] + 1 : 0;
            }
        }
        int ans = 0;
        for (int i = 0; i < n; i++) {
            stack<pii> stk;
            int max_col = -1;
            for (int j = 0; j < m; j++) {
                int pos = j;
                while (!stk.empty() && stk.top().second > up[i][j]) {
                    if (stk.top().first <= max_col)
                        ans++;
                    pos = stk.top().first;
                    stk.pop();
                }
                if (s[i + 1][j] == '0') max_col = j;
                if (!stk.empty() && stk.top().second == up[i][j]) continue;
                if (up[i][j]) stk.push({pos, up[i][j]});
            }
        }
        cout << ans << endl;
    }
    
    int main()
    {
        solve();
        return 0;
    }
    
    

    E.LiHuaAndPoker

    分类讨论

    • K = 1。这个情况,字符串的相对位置不变,所以可能最多只有n种(每一个字母做开头),对n种情况做一个比较即可,复杂度可以是O(n),O(nlogn),O(n2),O(n2logn)均可以通过。
    • K > 1。对于K大于1的所有情况,任何字符串都能调整成他的最小字典序(想想为什么),即对原字符串从小到大排序。对于K>2的排序情况类似冒泡排序。

    F.LiHuaAndArray

    一个经典的标记技巧(延迟计算)。对所有的[L,R]区间,在L位置标记+1,在R位置标记-1。标记结束后统计每一对奇偶位置的前缀和,前缀和是奇数的就交换位置,是偶数的不做操作。

    复杂度O(N)。

    G.Assassin

    模拟题,分阶段模拟

    • 负一从A点出发追小号
    • 负一追到小号后回A点

    注:有个学弟 “小号已经走的路程” 用了int变量,太心疼了

    H.DeadlyShoot

    这个题目在大一的c语言日常题目中出现过。

    Tutorial 1. Bruce force

    对着题意模拟一直做数位求和直到一位,然后分类找出最大的一组输出。

    Tutorial 2. Math

    我们设一个数A的数位和为S,那么易得A和S同余于9。由此,反复求数位和直到只剩一位这个操作等价于对9取模。因此,按照所有数对9的余数进行分类,最后输出余数最大的那一组即可,需要特别注意的是,当某个数能被9整除的时候,他最后得到的数位和是9而不是0。

    复杂度为(O(N))

    **
    **


    博主只是友情提供代发服务

  • 相关阅读:
    Kafka Kerberos客户端访问
    Kafka Kerberos服务端配置
    Centos安装Kafka
    aaaaaaaaaaaa
    Kafka队列消息和发布订阅消息
    RabbitMQ概念
    RabbitMQ使用
    windows下安装Erlang
    RabbitMQ简介
    Flume简介
  • 原文地址:https://www.cnblogs.com/wuyuanyuan/p/10226035.html
Copyright © 2011-2022 走看看