$ \color{#0066ff}{ 题目描述 }$

竞赛比完之后,水箱里充满水的选手们鱼贯而出。凡华中学的厕所规划的很糟,只有两个厕位,于是厕所门前排起了长长的队伍。

厕所有两个,一个是女生专用厕所,另一个是男女混用厕所。一共有2N个选手正在排队,男女生数量可能不同。如果队头的是妹子,只要某个厕所是空的就可以进入,但是如果两个厕所都是空的,那么优先进入女性专用厕所。而如果队头是个绅♂士,只有在男女混用厕所是空的时候才能使用;如果只有女性专用厕所是空的,那么队伍中最靠前的妹子就可以不用继续等直接如厕。我们假设所有人如厕都需要花1分钟,不考虑切换的时间。

然而,N分钟后,就要开饭了,所有人必须如厕完,不过看样子似乎来不及。主办方可以重新调换顺序,不过有些人会因为新的顺序中自己更加后面了而感到不满,不满度是自己相比于原队列后退了几个顺序(除此之外跟自己的实际如厕顺序无关)。

主办方发现了这一点,所以希望你帮助他们解决这个问题,设计出一种方案,对于其中不满意度最大的学生,尽可能让他的不满意度最小。你只需要告诉他门最不满意的学生的不满意度是多少。

\(\color{#0066ff}{输入格式}\)

由于人相当多,我们用几段字符串来描述这个队列。

第一行一个整数N

第二行一个整数M

接下来M行,有一个字符串Si和一个整数Ki构成,中间有空格隔开,字符串中只有'M'(男)和'F'(女)。最后的字符串就是 S1拼接K1次+ S2拼接K2次+ ... +SM拼接KM次

\(\color{#0066ff}{输出格式}\)

输出一个整数,表示答案。如果无论怎么样都没办法N分钟之内达成,请输出-1

\(\color{#0066ff}{输入样例}\)

5
3
FFF 1
M 5
FF 1

\(\color{#0066ff}{输出样例}\)

2

\(\color{#0066ff}{数据范围与提示}\)

原队列是FFFMMMMMFF

改进后的队列是FMMFFMMMFF

所以厕所会按照下面的时间使用:

分钟 1   2   3   4   5
共用 2 3 6 7 8
女用 1 4 5 9 10

两个妹子往后面移动了2位,所以不满意度是2

20% N<=10;M=1;K1=1

40% N<=100000;M=1;K1=1

100% 1<=N,Ki<=10^18;1<=M<=100000;所有Si字符串长度之和不超过200000

\(\color{#0066ff}{题解}\)

什么时候会浪费时间? 两个男的等厕所!会有一个厕所闲置。。

所以男的应该尽量靠前, 且不能有超过n个男的,要不然就无解了

我们从末尾计算后缀和,男-1女1,一旦后缀和到达了-2, 那么就会有两个男的决定谁去女厕的局面(雾

所以我们只要保证后缀和一直大于-2就行

因此,我们让每个女生向后走ans位,使得后缀和一直大于-2

于是我们只需记录一个后缀最小值,把它抬到-1就行了

实现时可以男女正负互换,取最大后缀,其实是一样的

#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
const int maxn = 2e5 + 10;
std::vector<char> v[maxn];
LL len[maxn];
LL max[maxn], ss[maxn];
char s[maxn];
LL num[maxn];
LL n, m, ans, now;
int main() {
n = in(), m = in();
LL tot = 0;
for(int i = 1; i <= m; i++) {
scanf("%s", s);
v[i].push_back('$');
for(char *p = s; *p; p++) v[i].push_back(*p);
for(int j = v[i].size() - 1; j >= 1; j--) {
ss[i] += (v[i][j] == 'F'? -1 : 1);
max[i] = std::max(max[i], ss[i]);
}
tot += (num[i] = in()) * ss[i];
}
if(tot > 0) return puts("-1"), 0;
ans = 1;
for(int i = m; i >= 1; i--) {
if(ss[i] > 0) ans = std::max(ans, now + (num[i] - 1) * ss[i] + max[i]);
else ans = std::max(ans, now + max[i]);
now += ss[i] * num[i];
}
printf("%lld", ans - 1);
return 0;
}

P3615 如厕计划的更多相关文章

  1. loj2734「JOISC 2016 Day 2」女装大佬 || 洛谷P3615 如厕计划

    loj2734 洛谷P3615 http://218.5.5.242:9021/problem/185 不会做... 题解(来自ditoly): 这一步更详细的解释(来自kkksc03): 还是从后面 ...

  2. LuoguP3615 如厕计划

    题面 现有两个厕所,一个女士专用,一个通用,给出\(2*n\)个排成一列的人的性别 每人如厕需要一分钟,假如女厕是空的,女生中最靠前的可以直接进入. 需要通过调换顺序使得所有人都上完厕所最后的时间为n ...

  3. fjwc2019 D3T2 送分题

    #185. 「2019冬令营提高组」送分题 这是原题..... P3615 如厕计划 手推一推你发现,显然男性不能多于女性. 然后你或许可以发现一个神奇的性质. 对于每个序列,我们记$M$为$1$,$ ...

  4. NOIP前的刷题记录

    因为这几天要加油,懒得每篇都来写题解了,就这里记录一下加上一句话题解好了 P4071 [SDOI2016]排列计数   组合数+错排 loj 6217 扑克牌 暴力背包 P2511 [HAOI2008 ...

  5. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  6. FOI冬令营 Day 3

    目录 T1.签到题(sort) 传送门 Code T2.送分题(queue) 传送门 Code T3.简单题(game) 传送门 Code 咕咕咕 T1.签到题(sort) 传送门 原题:LOJ 27 ...

  7. 【声明】前方不设坑位,不收费!~ 我为NET狂官方学习计划

    发个通知,过段时间学习计划相关的东西就出来了,上次写了篇指引文章后有些好奇心颇重的人跟我说:“发现最近群知识库和技能库更新的频率有点大,这是要放大招的节奏啊!” 很多想学习却不知道如何规划的人想要一个 ...

  8. SQL Server-聚焦查询计划Stream Aggregate VS Hash Match Aggregate(二十)

    前言 之前系列中在查询计划中一直出现Stream Aggregate,当时也只是做了基本了解,对于查询计划中出现的操作,我们都需要去详细研究下,只有这样才能对查询计划执行的每一步操作都了如指掌,所以才 ...

  9. ORACLE从共享池删除指定SQL的执行计划

    Oracle 11g在DBMS_SHARED_POOL包中引入了一个名为PURGE的新存储过程,用于从对象库缓存中刷新特定对象,例如游标,包,序列,触发器等.也就是说可以删除.清理特定SQL的执行计划 ...

随机推荐

  1. PyInstaller打包成exe可执行文件

    PyInstaller 安装pyinstaller 对于那些网络比较稳定,能够流畅使用pip源地址的用户,直接下面的命令就可以搞定: pip install pyinstaller 通常我们会下载源码 ...

  2. Elasticsearch之插件介绍及安装

    ES站点插件(以网页形式展现) 1.BigDesk Plugin (作者 Lukáš Vlček) 简介:监控es状态的插件,推荐![目前不支持2.x] 2.Elasticsearch Head Pl ...

  3. 使用avalon实现SKU组合查询功能

    SKU(stock keeping unit库存量单位)组合查询是网上商场一个非常常用的功能.具体来说,一件商品会有许多型号,许多颜色,许多产地,许多码寸,而满足用户选中的这些条件的具体商品可能有库存 ...

  4. IAR&nbsp;FOR&nbsp;ARM&nbsp;各版…

    用过Keil和IAR,个人感觉是IAR还是很不错的.下载地址是: http://files.iar.com/ftp/pub/box/CD-EWARM-6301-3142.zip V6.30.1(该地址 ...

  5. 概览JVM的基本结构和JVM内存结构

    概览JVM的基本结构和JVM的内存结构 这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫 ...

  6. PHP数据结构之一:PHP数据结构基本概念—数据结构

    学习任何一种技术都应该先清楚它的基本概念,这是学习任何知识的起点!本文是讲述数据结构的基本概念,适合对数据结构已经有一定基础的程序员,更是适合想要学习数据结构的code一族!让我们开始PHP数据结构的 ...

  7. FastDFS介绍和配置过程 二

      最近在研究负载均衡和集群,其中涉及到一个主要问题是,如何让集群中的real server共享一套文件系统.在网上查到FastDFS,国人(happy fish,感谢他的开源精神)开发的一套轻量级分 ...

  8. tomcat的配置文件有那些

    配置文件一般都在conf文件夹里,主要有server.xml,context.xml,tomcat_user.xml,web.xml四个常用配置文件,server主要是服务器设置的,例如端口设置,路径 ...

  9. js 线程和进程的关系

    进程(process)和线程(thread)是操作系统的基本概念 1.计算机的核心是CPU,它承担了所有的计算任务 2.单个CPU一次只能运行一个任务 3.进程它代表CPU所能处理的单个任务.任一时刻 ...

  10. 何为软件的Alpha、Beta、RC和GA发布版本?

    简介 一个软件或者一个功能在发布时,通常会有Beta版这么一说.我很熟悉,差不多知道是什么意思,但没去深究,感觉上就是一个可以用但不保证功能稳定的版本. 直到昨天我看到了 MariaDB 数据库发布标 ...