CF1825C LuoTianyi and the Show
传送门(luogu)
传送门(CF)
前言
我来水题解力
简化题意
\(n\) 个人,\(m\) 个座位,每个人落座的方法有三种:
坐最左边的人的左边,没人的话就做 \(m\) 号座位,若最左边的为 \(1\) 号,就离开;
坐最右边的人的右边,没人的话就做 \(1\) 号座位,若最右边的为 \(m\) 号,就离开;
坐在 \(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的更多相关文章
- aop切入mapper接口
***************************************分割线****************************************************** 参考: ...
- C语言 指针基础篇 数组,函数与指针的运用 2 14
下面看看如何在函数中运用指针吧 下面是往函数传入指针的简单操作,不是传入数组的.判断一个a是否大于b是的话给,是的话对其进行操作,不是的话就直接返回. #include <stdio.h> ...
- python 基础_字符串9
凡是重要的# 字符串的创建,字符串可以是单引号创建也可以是双引号创建 str1 = 'hello world' #当你要输出的是单引号的时候,你括起字符串的必须是双引号.当你输出的是双引号的时候,你括 ...
- 2020强网杯青少赛Pursuing_The_Wind战队WRITEUP
在线文档:https://docs.qq.com/doc/DZkN0RFFaR1ZDdHhD 旧事拾荒,偶遇该文档,既发. 战队信息 战队名称:Pursuing_The_Wind 战队排名:12 ...
- NewStarCTF 公开赛 2022 RE WP
Week 2 Re 前可见古人,后得见来者 chipher = [0x51, 0x5B, 0x4C, 0x56, 0x59, 0x4D, 0x50, 0x56, 0x54, 0x43, 0x7D, 0 ...
随机推荐
- superset连接mysql数据
目前superset的官网没给出windows的安装教程,但是实际操作是可以的,网上有很多教程,再次就不赘述! 本篇随笔是介绍superset如何连接mysql数据源,本人踩坑踩了一整天.=_= ~~ ...
- [WinUI 3] 如何利用D3D11在SwapChainPanel控件上绘制OpenGL(Uwp通用)
预览 技术实现 看过我上篇在 WPF 中实现 OpenGL 与 D3D 渲染的同学应该知道,我是依靠 WGL 中 WGL_NV_DX_interop 扩展与 D3D Surface 关联并在使用该 S ...
- 声网推出首个完整实时合唱解决方案 即将上线“咪哒”全国线下K歌房
4月20日,声网Agora宣布对实时合唱技术方案全面升级,帮助国内知名迷你KTV品牌"咪哒"实现国内首个支持多终端.多人合唱.高音质的完整实时合唱解决方案的落地,结束了国内K歌行业 ...
- CF1037H Security题解
根据字典序的定义,位置大的大于长度长的,长度长的大于长度短的. 所以我们贪心,先追求长度长的,再追求后面的位置大的,再追求前面的位置大的. 我们要一个能遍历子串的结构,就选 SAM 得了. 还有个限制 ...
- 使用chatgt(GPT-4)将过程式(的java代码)改成函数式(的elixir代码)
天啦噜太可怕了,之前我还嘲笑chatgpt不会小众语言来着. chatgt(GPT-4)在接收2次prompt后,把过程式(的java代码)改成了函数式(的elixir代码),给出的Elixir代码可 ...
- 可视化—AntV G6 紧凑树实现节点与边动态样式、超过X条展示更多等实用小功能
通过一段时间的使用和学习,对G6有了更一步的经验,这篇博文主要从以下几个小功能着手介绍,文章最后会给出完整的demo代码. 目录 1. 树图的基本布局和使用 2. 根据返回数据的属性不同,定制不一样的 ...
- stm32的学习笔记1
一 目录结构管理 Libraries是放官方固件库的 MDK-ARM是放产生的文件的,工程存放的目录 USERS是放自己写的代码的 然后是一个解释文件README 在MDK-ARM目录里还要创建两个文 ...
- v-if与v-show造成部分元素丢失的问题——v-if复用元素问题
pre { overflow-y: auto; max-height: 400px } img { max-width: 500px; max-height: 300px } 问题描述 在写tab切换 ...
- redis 基于 漏斗算法 实现对 api 的限流
漏斗算法 漏桶算法的原理: 漏桶有一定的容量,给漏桶注水,当单位时间内注入水量大于流出水量,漏桶内积累的水就会越来越多,直到溢出. 就好比大批量请求访问nginx相当于注水,nginx根据配置按照固定 ...
- 【Vue2.x源码系列06】计算属性computed原理
上一章 Vue2异步更新和nextTick原理,我们介绍了 JavaScript 执行机制是什么?nextTick源码是如何实现的?以及Vue是如何异步更新渲染的? 本章目标 计算属性是如何实现的? ...