土豪聪要请客(题解)

土豪聪要请客

试题描述

众所周知,聪哥(ndsf)是个土豪,不过你们不知道的是他的MZ和他的RMB一样滴多……
某天土豪聪又赚了10^10000e的RMB,他比较开心,于是准备请客。他在自己在XX星上的别墅里面大摆酒席,想要邀请尽可能多的MZ来参加他的宴会。他将会同MZ一起坐在一个巨大的长方形桌子上。这个桌子能坐下的人数等于他的边长。聪哥要求他的桌子能够放进他的别墅,并且桌子的边必须与别墅的边界平行。给定别墅的平面图,请你求出聪哥最多可以请多少个MZ。

输入

第一行n,m。表示别墅的长宽
下面n行,每行m个字符,表示一个方块是空的(‘.’)或是被占用了(‘X’)。
聪哥只要他的桌子放在别墅里,并且桌子不能占用任何一个已经占用了的方块。

输出

一个数,表示聪哥最多可以请几个Maze。

输入示例1

2 2
..
..

输出示例1

7

输入示例2

4 5
..X..
.X...
X....
.....

输出示例2

11

上一题是CZY的MZ,这题变成聪哥的了……

先明确一下题意,智商捉急的我看了半天样例才理解:地图中选一个周长最大的只包含字符‘.’的矩形,使矩形周长最大,答案是这个最大的周长-1.

我的思路是这样的:枚举上下边界,于是可以把二维的地图压缩成一维的(只要当前列有障碍物X就压成一个‘X’,没有就压成一个‘.’,如样例2地图中,当前枚举到2~4行,那么压缩后的地图变为“XX...”)。压缩成一维后,问题转化为“在一个只包含字符X和字符.的字符串中,选一个尽量长的只包含字符‘.’的连续子串”,因为是连续的,左右端点构成一个滑动窗口,可以用“尺取法”(个人习惯的叫法,详见代码)解决。



#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std;

int read() {
    int x = 0, f = 1; char c = getchar();
    while(!isdigit(c)){ if(c == ‘-‘) f = -1; c = getchar(); }
    while(isdigit(c)){ x = x * 10 + c - ‘0‘; c = getchar(); }
    return x * f;
}

#define maxn 410
#define INF 1073741823
int n, m, l, r, ans, S[maxn][maxn];
char Map[maxn][maxn];
bool can[maxn];

int main() {
    n = read(); m = read();
    for(int i = 1; i <= n; i++) scanf("%s", Map[i] + 1);

    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            S[i][j] = S[i-1][j] + (Map[i][j] == ‘X‘);
    for(int i = 1; i <= n; i++)
        for(int j = i; j <= n; j++) {
            memset(can, 0, sizeof(can));
            for(int k = 1; k <= m; k++) can[k] = !(S[j][k] - S[i-1][k]);
            l = 1; int tmp = -INF;
            for(r = 1; r <= m; r++) if(!can[r]) l = r + 1;
            else tmp = max(tmp, r - l + 1);
            ans = max(ans, (tmp + j - i + 1 << 1) - 1);
        }

    printf("%d\n", ans);

    return 0;
}
时间: 2024-10-13 09:00:33

土豪聪要请客(题解)的相关文章

土豪聪要请客(stol)

土豪聪要请客(stol) 众所周知,聪哥(ndsf)是个土豪,不过你们不知道的是他的MZ和他的RMB一样滴多…… 某天土豪聪又赚了10^10000e的RMB,他比较开心,于是准备请客.他在自己在XX星上的别墅里面大摆酒席,想要邀请尽可能多的MZ来参加他的宴会.他将会同MZ一起坐在一个巨大的长方形桌子上.这个桌子能坐下的人数等于他的边长.聪哥要求他的桌子能够放进他的别墅,并且桌子的边必须与别墅的边界平行.给定别墅的平面图,请你求出聪哥最多可以请多少个MZ. 输入格式 第一行n,m.表示别墅的长宽

cogs 2320. [HZOI 2015]聪聪的世界题解

2320. [HZOI 2015]聪聪的世界 时间限制:6 s   内存限制:512 MB [题目描述] 背景: 聪聪的性取向有问题. 题目描述: 聪聪遇到了一个难题: 给出一个序列a1-an,完成以下操作: 1  x 询问从x向左数第一个<ax的数: 2  x 询问从x向左数第一个>ax的数: 3  x 询问从x向右数第一个<ax的数: 4  x 询问从x向右数第一个>ax的数: 5  x y 交换ax与ay: 6  x y w 给ax-ay加上w: 7  x y w 给ax-a

题解:luogu P2634 [国家集训队]聪聪可可

题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏. 他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个"点",并用n-1条"边"把这n个"点"恰好连通(其实这就是一棵树).并且每条"边"上都有一个数.接下来由聪聪和可可分别随即选

题解报告——聪聪与可可

题目传送门 题目描述 在一个魔法森林里,住着一只聪明的小猫聪聪和一只可爱的小老鼠可可.虽 然灰姑娘非常喜欢她们俩,但是,聪聪终究是一只猫,而可可终究是一只老鼠, 同样不变的是,聪聪成天想着要吃掉可可. 一天,聪聪意外得到了一台非常有用的机器,据说是叫 GPS,对可可能准确 的定位.有了这台机器,聪聪要吃可可就易如反掌了.于是,聪聪准备马上出发, 去找可可.而可怜的可可还不知道大难即将临头,仍在森林里无忧无虑的玩耍. 小兔子乖乖听到这件事,马上向灰姑娘报告.灰姑娘决定尽快阻止聪聪,拯救可 可,可她

[BZOJ 2152]聪聪可可

Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏.他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个“点”,并用n-1条“边”把这n个“点”恰好连通(其实这就是一棵树).并且每条“边”上都有一个数.接下来由聪聪和可可分别随即选一个点(当然他们选点时是看不到这棵树的),如果两个点之间所

【NOI2005】 聪聪可可

树分治劲啊 原题: 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏.他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个"点",并用n-1条"边"把这n个"点"恰好连通(其实这就是一棵树).并且每条"边"上都有一个数.接下来由聪聪和可可分

【bzoj1415】[Noi2005]聪聪和可可 期望记忆化搜索

题目描述 输入 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行,每行两个整数,第i+2行的两个整数Ai和Bi表示景点Ai和景点Bi之间有一条路. 所有的路都是无向的,即:如果能从A走到B,就可以从B走到A. 输入保证任何两个景点之间不会有多于一条路直接相连,且聪聪和可可之间必有路直接或间接的相连. 输出 输出1个实数,四舍五入保留三位小数,表示平均多少个时间单

17.2.10 NOIP模拟赛 聪哥的工资

聪哥的工资 (money/money.in/money.out) 时限1000ms 内存256MB 题目描述 lwher: 了体验劳苦大众的生活,聪哥在暑假参加了打零工的活动,这个活动分为n个工作日,每个工作日的工资为Vi.有m个结算工钱的时间,聪哥可以自由安排这些时间,也就是说什么时候拿钱,老板说的不算,聪哥才有发言权! (因为聪哥是土豪,他是老板的老板,你觉得老板敢给聪哥安排任务吗?所以聪哥的工作就是看心情去拿钱拿完就走人啦...) 聪哥不喜欢身上一次性有太多的钱,于是他想安排一下拿钱的时间

【二分】【中等难度】noip模拟赛 聪哥的工资

聪哥的工资 (money/money.in/money.out) 时限1000ms 内存256MB 题目描述 lwher: 了体验劳苦大众的生活,聪哥在暑假参加了打零工的活动,这个活动分为n个工作日,每个工作日的工资为Vi.有m个结算工钱的时间,聪哥可以自由安排这些时间,也就是说什么时候拿钱,老板说的不算,聪哥才有发言权! (因为聪哥是土豪,他是老板的老板,你觉得老板敢给聪哥安排任务吗?所以聪哥的工作就是看心情去拿钱拿完就走人啦...) 聪哥不喜欢身上一次性有太多的钱,于是他想安排一下拿钱的时间