传送门(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. 使用RPA有什么好处

    通过本章学习,您将了解到: 什么是RPA RPA能为我们做些什么 使用RPA有什么好处 RPA的体系结构是什么 应用RPA是否需要深入了解这项技术 RPA的未来趋势怎么样 什么是RPA? RPA即Ro ...

  2. MyBatis详细代码来啦!

    家人们,改代码改到现在真的绝了,终于是改出来了,但是对于某些判断性的小问题还没写,细节性满满的增删改查终于实现啦! 目录结构 各个文件的代码: //SqlSessionFactoryUtils.jav ...

  3. 手把手 Golang 实现静态图像与视频流人脸识别

    说起人脸识别,大家首先想到的实现方式应该是 Python 去做相关的处理,因为相关的机器学习框架,库都已经封装得比较好了.但是我们今天讨论的实现方式换成 Golang,利用 Golang 去做静态图像 ...

  4. 组合计数中的q-模拟 q analog

    拒绝更新,深度和广度上建议看这个pdf URL里面用到的一些query-string过期了,,, 论文题目是 THE q-SERIES IN COMBINATORICS; PERMUTATION ST ...

  5. ABAP 调用HTTP上传附件(二)之中文乱码

    1.这篇文章的由来 之前已经发表了<ABAP 调用HTTP上传附件>的文章,详细介绍了如何通过HTTP请求传输附件,可点击链接参考原有文档 因为之前对传输文件的中文文件名处理上解释不够详细 ...

  6. Cesium 后处理(Post Process)

    原文地址:https://blog.csdn.net/ls870061011/article/details/123910821 作者:GIS李胜 为实现三维模型的更炫.更酷.更美观,Cesium在1 ...

  7. 在一张 24 GB 的消费级显卡上用 RLHF 微调 20B LLMs

    我们很高兴正式发布 trl 与 peft 的集成,使任何人都可以更轻松地使用强化学习进行大型语言模型 (LLM) 微调!在这篇文章中,我们解释了为什么这是现有微调方法的有竞争力的替代方案. 请注意, ...

  8. HashMap正确遍历方式,千万不要再forforfor啦!!!

    for (int i = 0; i < map.size(); i++) { if (map.get(i)/n>=0.01) { num++; } } 上述代码报空指针异常.为什么? 循环 ...

  9. aspnetcore中aop的实现

    aaspnetcore开发框架中实现aop不仅仅在业务上,在代码的优雅简洁和架构的稳定上都有着至关重要. 下面介绍三种用过的. 第一种通过System.Reflection的DispatchProxy ...

  10. Python 中 is 和 == 的区别

    is 和 == 的区别 相信学过 Python 小伙伴们都知道 is 和 == 都是用来比较 Python 对象的,但是区别就是 is 比较需要对象的值和内存地址都相等 == 比较只需要对象的值相等就 ...