传送门(luogu)

传送门(CF)

前言

我来水题解力

简化题意

\(n\) 个人,\(m\) 个座位,每个人落座的方法有三种:

  1. 坐最左边的人的左边,没人的话就做 \(m\) 号座位,若最左边的为 \(1\) 号,就离开;

  2. 坐最右边的人的右边,没人的话就做 \(1\) 号座位,若最右边的为 \(m\) 号,就离开;

  3. 坐在 \(x_i\) 号座位上,有人就离开。

问任意搭配 \(n\) 个人落座顺序,坐下人数的最大值。

(这真的是简化题意吗)

Solution

思路

容易发现我们可以:

一直放 \(1\) 或 \(2\) 类人,碰到 \(3\) 类人要坐的位置就让 \(3\) 类人坐。

因为碰到第 \(3\) 类人的座位时,与其放 \(1\) 或 \(2\) 类人浪费放置次数,不如直接放第 \(3\) 类人。

那么我们要从哪儿开始放才能保证是最优解呢?

不难发现,起点的位置要么是一个第 \(3\) 类人的左右两边,要么是 \(1\) 或 \(m\) 号点。

于是,对于每一个 \(3\) 类人,我们可以计算出他左右两边不计其他第 \(3\) 类人占的座位的空座位数,以此来一一放置第 \(1,2\) 类人。

别忘了 \(1,m\) 号点也是起点。

时间复杂度

计算空座位只需 \(O(n)\)。

代码实现

写的丑,轻喷。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std; const int N = 1e5 + 5; int t, n, m;
int a[N], cntl, cntr; int main(){
cin >> t;
while(t -- ) {
cntr = 0; cntl = 0; //多次不清空,亲人两行泪 cin >> n >> m;
for (int i = 1; i <= n; ++ i )
cin >> a[i]; sort(a + 1, a + 1 + n); //排序方便计算空座位数 int i;
for (i = 1; i <= n; ++ i ) //计算 1,2 类人的数量
if(a[i] == -1) cntl ++ ;
else if(a[i] == -2) cntr ++ ;
else break; n = unique(a + i, a + 1 + n) - a - 1;
//将第 3 类人去重,因为相同座位只能坐一个;i 是第一个第 3 类人的编号 int ans = 0; for (int j = i; j <= n; ++ j ) {
int L = a[j] - 1 - (j - i); //(j-i) -> a[j]之前有多少个第 3 类人
int R = m - a[j] - (n - j); //(n-j) -> a[j]之后有多少个第 3 类人
ans = max(ans, 1 + n - i + min(L, cntl) + min(R, cntr));
} ans = max(ans, n - i + 1 + max(min(cntl, m - (n - i + 1)), min(cntr, m - (n - i + 1))));
//(n - i + 1) -> 第 3 类人个数 cout << ans << "\n";
}
return 0;
}

CF1825C LuoTianyi and the Show的更多相关文章

  1. aop切入mapper接口

    ***************************************分割线****************************************************** 参考: ...

  2. C语言 指针基础篇 数组,函数与指针的运用 2 14

    下面看看如何在函数中运用指针吧 下面是往函数传入指针的简单操作,不是传入数组的.判断一个a是否大于b是的话给,是的话对其进行操作,不是的话就直接返回. #include <stdio.h> ...

  3. python 基础_字符串9

    凡是重要的# 字符串的创建,字符串可以是单引号创建也可以是双引号创建 str1 = 'hello world' #当你要输出的是单引号的时候,你括起字符串的必须是双引号.当你输出的是双引号的时候,你括 ...

  4. 2020强网杯青少赛Pursuing_The_Wind战队WRITEUP

    在线文档:https://docs.qq.com/doc/DZkN0RFFaR1ZDdHhD    旧事拾荒,偶遇该文档,既发. 战队信息 战队名称:Pursuing_The_Wind 战队排名:12 ...

  5. NewStarCTF 公开赛 2022 RE WP

    Week 2 Re 前可见古人,后得见来者 chipher = [0x51, 0x5B, 0x4C, 0x56, 0x59, 0x4D, 0x50, 0x56, 0x54, 0x43, 0x7D, 0 ...

随机推荐

  1. VUE+.NET应用系统的国际化-多语言词条服务

    上篇文章我们介绍了 VUE+.NET应用系统的国际化-整体设计思路 系统国际化改造整体设计思路如下: 提供一个工具,识别前后端代码中的中文,形成多语言词条,按语言.界面.模块统一管理多有的多语言词条 ...

  2. 量子图形加密算法的MATLAB代码实现

    一.概述 目前主流的量子图形加密算法有量子像素编码算法(Quantum Image Pixel Encoding,QIPE).量子像素置乱算法(Quantum Image Pixel Scrambli ...

  3. jetbrains账户的注册

    注册步骤 1.进入官网界面 官网地址在这里啦:https://www.jetbrains.com/ 官网本来显示的是这个界面: 点击右上角的Learning Tools,然后选择该页面内的这里: 2. ...

  4. 关于如何编写好金融科技客户端SDK的思考

    引言 回想起来,我在目前的团队(金融科技领域)待了有很长一段时间了,一直在做SDK研发,平时工作中经历过大刀阔斧一蹴而就的喜悦,也经历过被一个问题按在地上摩擦,无奈"废寝忘食"的不 ...

  5. CROS跨域问题的解决

    转载: 作者:小丞同学链接:https://www.zhihu.com/question/452543297/answer/2247177767来源:知乎 在前后端交互的过程中,经常会遇到跨域的问题, ...

  6. MyBatisPlus 整合 SpringBoot 遇见的问题(二)

    [异常]:Cause: java.sql.SQLSyntaxErrorException: Unknown column 'udf1' in 'field list'...... SQL: SELEC ...

  7. 电商平台趋势妙手采集类API接口

    电商平台趋势,平台化.大家可以看到大的电商都开始有自己的平台,其实这个道理很清楚,就是因为这是充分利用自己的流量.自己的商品和服务大效益化的一个过程,因为有平台,可以利用全社会的资源弥补自己商品的丰富 ...

  8. Goalng:基础复习一遍过

    Go(又称Golang)是Google开发的一种静态强类型.编译型.并发型,并具有垃圾回收功能的编程语言. 剖析 Hello world 新建文件 main.go 写入以下内容: package ma ...

  9. [Git]git分支查询——图像化[转载]

    1 git reflog git reflog : 可查看所有分支的所有操作记录(含: commit / reset / merge / checkout等操作) 1-1 查看分支的所有变更记录(含: ...

  10. 五月二号java基础知识

    1.使用Runnable接口可以轻松实现多个线程共享相同数据,只要用用一个可运行对象作为参数创建多个线程就可以了2.当一个线程对共享的数据进行操作时,应使之成为一个"原子操作"即在 ...