2019-08-22 纪中NOIP模拟赛A&B组

T1 [JZOJ3229] 回文子序列

题目描述

  回文序列是指左右对称的序列。我们会给定一个N×M的矩阵,你需要从这个矩阵中找出一个P×P的子矩阵,使得这个子矩阵的每一列和每一行都是回文序列。

数据范围

  对于 $20\%$ 的数据,$1 \leq N,M \leq 10$

  对于 $100\%$ 的数据,$1 \leq N,M \leq 300$

分析

  $O(n^5)$ 暴力跑起来真实快

#include <iostream>
#include <cstdio>
#include <cstdlib> 
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 305

int n, m, flag;
int g[N][N];

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            scanf("%d", &g[i][j]);
    for (int k = min(n, m); k; k--)
        for (int x = 1; x + k - 1 <= n; x++)
            for (int y = 1; y + k - 1 <= m; y++) {
                flag = 1;
                for (int i = 0; i < k; i++) {
                    for (int j = 1; j <= k / 2; j++)
                        if (g[x + i][y + j - 1] != g[x + i][y + k - j] ||
                            g[x + j - 1][y + i] != g[x + k - j][y + i]) {
                            flag = 0; break;
                        }
                    if (!flag) break;
                }
                if (flag) {printf("%d", k); return 0;}
            }
    
    return 0;
}
View Code

T2 [JZOJ3230] 树环转换

题目描述

  给定一棵N个节点的树,去掉这棵树的一条边需要消耗值1,为这个图的两个点加上一条边也需要消耗值1。树的节点编号从1开始。在这个问题中,你需要使用最小的消耗值(加边和删边操作)将这棵树转化为环,不允许有重边。

  环的定义:(1)该图有N个点,N条边。(2)每个顶点的度数为2。(3)任意两点是可达的。

  树的定义:(1)该图有N个点,N-1条边。(2)任意两点是可达的。

数据范围

  对于 $20\%$ 的数据,$1 \leq N \leq 10$

  对于 $100\%$ 的数据,$1 \leq N \leq 10^6$

分析

猜你喜欢

转载自www.cnblogs.com/Pedesis/p/11396206.html
今日推荐