Monthly-201901 tutorial

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种情况,然后分类讨论一下

  • m==1:当m==1时,任意长度为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(n^2),O(n^2logn)均可以通过。
  • 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)\)



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

原文地址:https://www.cnblogs.com/wuyuanyuan/p/10226035.html

时间: 2024-10-08 08:26:09

Monthly-201901 tutorial的相关文章

Career Planning:Developers Best Practices Tutorial

This small tutorial is based on my past 16+ years of experience in software development industry. I have gone through different stages in my career starting from trainee software developer till senior management. I do not want to keep my learnings to

Microsoft Azure Tutorial: Build your first movie inventory web app with just a few lines of code

Editor's Note: The following is a guest post from Mustafa Mahmutovi?, a Microsoft Student Partner who attends the Faculty of Electrical Engineering at the University of Sarajevo where he is a Computer Science Major. In this tutorial, you will learn h

初译 Support Vector Machines:A Simple Tutorial(一)

从本次开始我将开始尝试着逐章翻译一下 Alexey Nefedov的<Support Vector Machines:A Simple Tutorial>这本教材,这可是我们导师极力推荐的SVM教材,看了好久一直感觉一脸懵逼,索性开坑翻译一下吧,也当是加深理解,毕竟我也是一知半解,如果翻译的有不对的地方还望大佬们斧正,欢迎提意见,欢迎讨论. 嗯,就是这样. (一)Introduction 在本章节中将会介绍一些用于定义支持向量机(SVM)的基础的概念,这些概念对于理解SVM至关重要,假定读者了

ZetCode PyQt4 tutorial Dialogs

#!/usr/bin/python # -*- coding: utf-8 -*- """ ZetCode PyQt4 tutorial In this example, we receive data from a QtGui.QInputDialog dialog. author: Jan Bodnar website: zetcode.com last edited: October 2011 """ import sys from PyQ

1639: [Usaco2007 Mar]Monthly Expense 月度开支

1639: [Usaco2007 Mar]Monthly Expense 月度开支 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 593  Solved: 295[Submit][Status] Description Farmer John是一个令人惊讶的会计学天才,他已经明白了他可能会花光他的钱,这些钱本来是要维持农场每个月的正常运转的.他已经计算了他以后N(1<=N<=100,000)个工作日中每一天的花费moneyi(1<=money

简单的LESS Tutorial

1. 什么是LESS? LESS是一种动态的CSS语言,更专业的称呼是CSS preprocessor.作为CSS的扩展语言,LESS可以让CSS文件逻辑上更清晰,从而更容易维护和更新.LESS是开源的,诞生于2009年,采用javascript开发, LESS深受另外一种动态CSS语言SASS/SCSS的影响(SCSS是SASS的升级版) .相对于SASS/SCSS或者其他CSS preprocessor, LESS的典型特征有两个, 支持实时编译,例如网页或者应用可以直接应用less文件,通

[BZOJ] 1639: [Usaco2007 Mar]Monthly Expense 月度开支

1639: [Usaco2007 Mar]Monthly Expense 月度开支 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1077  Solved: 533[Submit][Status][Discuss] Description Farmer John是一个令人惊讶的会计学天才,他已经明白了他可能会花光他的钱,这些钱本来是要维持农场每个月的正常运转的.他已经计算了他以后N(1<=N<=100,000)个工作日中每一天的花费moneyi(1

[BZOJ1639][Usaco2007 Mar]Monthly Expense 月度开支

1639: [Usaco2007 Mar]Monthly Expense 月度开支 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1069  Solved: 530 [Submit][Status][Discuss] Description Farmer John是一个令人惊讶的会计学天才,他已经明白了他可能会花光他的钱,这些钱本来是要维持农场每个月的正常运转的.他已经计算了他以后N(1<=N<=100,000)个工作日中每一天的花费moneyi

(翻译)deeplearning.net/tutorial —— 栈式去噪自编码器(SdA)

前言 栈式去噪自编码器是栈式自动编码器的扩展[Bengio07],并且它在[Vincent08]里有介绍. 这次教程建立在之前的去噪自编码器Denoising Autoencoders.如果你对自编码器没什么了解,建议你先了解一下. 栈式自编码器 通过把上一层去噪自编码器找到的隐藏输入(output code)当作下一层的输入,我们可以把去噪自编码器以栈的形式构成一个深度网络.这种无监督预训练的结构在一层里同时实现.每一层当作一个去噪自编码器,通过重构输入(上一层的输出)最小化损失.一旦前面 层

A Complete ActiveX Web Control Tutorial

? Introduction ActiveX is a Microsoft technology developed in the mid 90's, that allows for the creation of applet-like applications that can be downloaded and run within Microsoft's Web browser. This article is intended for Visual C++ developers who