Codeforces Round 509 (Div. 2) C. Coffee Break

news2025/6/8 22:02:27

在这里插入图片描述

在这里插入图片描述

题目大意:

给你n、m、d
n为元素个数,m为数列长度,d为每个元素之间的最短间隔

问最少需要多少个数列可以使得元素都能装进数列,并且满足每个元素之间的间隔大于等于d

核心思想

使用贪心的思想,将元素的大小进行排序,问题出在必须要优化,不能直接模拟,否则会超时

思路1

使用vector和二分进行处理,
用nums记录原数组
维护一个order动态数组记录原数组从小到大的数分别对应的下标是什么
放置策略是按order数组中%k余数相同的元素放到一个数列,即1,2,…,k,1,2,…k
然后用二分假设多少个数组可以满足要求,其中二分的判定条件就是
n u m s [ o r d e r [ i ] ] − n u m s [ o r d e r [ i − m ] ] < = d nums[order[i]]-nums[order[i-m]]<=d nums[order[i]]nums[order[im]]<=d
m代表二分的中间值,这里是判断原数组中第i大的数-第i-m大的数之间的间隔是否大于等于d
满足后使用map将%k余数相同的元素放到同一组,最后按照顺序从小到大输出即可

// Author: zengyz
// 2025-06-07 10:59

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

const int N = 2e5 + 10;

void solve()
{
  int n, m, d;
  cin >> n >> m >> d;
  vector<int> nums(n);
  for (auto &v : nums)
    cin >> v;
  vector<int> order(n);
  iota(order.begin(), order.end(), 0);
  sort(order.begin(), order.end(), [&](int i, int j)
       { return nums[i] < nums[j]; });
  int l=1,r=n;
  while(l<=r)
  {
   int m = (l + r) / 2;
    bool flg=true;
    for(int i=m;i<n;i++)
    {
      if(nums[order[i]]-nums[order[i-m]]<=d)
      {
        flg=false;
        break;
      }
    }
    if (flg) r = m - 1;
        else l = m + 1;
  }
  cout<<l<<endl;
  vector<int>ans(n);
for(int i=0;i<n;i++)
ans[order[i]]=i%l+1;
for(auto &x:ans)cout<<x<<" ";
}

int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  int _T = 1;
  // cin >> _T;
  while (_T--)
  {
    solve();
  }
  return 0;
}

思路2

使用优先队列

维护一个递增优先队列p,其中维护每一个数列的已经放置的最后一个元素
先将元素排序后将最小的元素放到优先队列,并定义它为第一个队列的元素(ans[b[1]]=1)
每次判断从优先队列中拿出队头元素(最小),如果满足要求可以放置,那么把这个元素从队头中移除,并把这个元素放到和队头元素相同的数列中ans[b[i]]=ans[b[top]]
否则就新开一个队列,最后把这次判断的元素放到优先队列中:
1.满足要求可以放置,那么因为队头元素已经被移除,那么这个元素就代表着队头元素所在队列
2.不可以放置,那么它新开一个队列,它本身就代表了一个新的队列,也把它放到优先队列中

// Author: zengyz
// 2025-06-07 10:59

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

const int N = 2e5 + 10;
int a[N];
int b[N];
map<int,int>ans;
void solve()
{
  int n, m, d;
  cin >> n >> m >> d;
  priority_queue<int, vector<int>, greater<int>> p;
  for (int i = 1; i <= n; i++)
  {
    cin >> a[i];
    b[i] = a[i];
  }
  sort(b + 1, b + 1 + n);
  int cnt = 1;

  p.push(1);
  ans[b[1]] = 1;
  for (int i = 2; i <= n; i++)
  {
    auto top = p.top();
    if (b[i] - b[top] > d)
    {
      p.pop();
      ans[b[i]] = ans[b[top]];
    }
    else
    {
      ans[b[i]] = ++cnt;
    }
    p.push(i);
  }

  cout << cnt << endl;
  for (int i = 1; i <= n; i++)
  {
    cout << ans[a[i]] << " ";
  }

  return;
}

int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  int _T = 1;
  // cin >> _T;
  while (_T--)
  {
    solve();
  }
  return 0;
}

思路3

set+结构体
思路借鉴自:https://www.cnblogs.com/Chen-Jr/p/11007190.html
定义一个结构体,id表示元素的原位置,确定它的排序规则为按val排序
先将数据读取,然后使用set对结构体进行存储
使用lower_bound(其实也是二分)来查询当前集合中有没有满足要求的
定义tmp=当前元素值+间隔,即要放入当前元素所需要的最小值
不满足
s t . l o w e r _ b o u n d ( N o d e ( t m p , − 1 ) ) = = s t . e n d ( ) st.lower\_bound(Node(tmp, -1)) == st.end() st.lower_bound(Node(tmp,1))==st.end()
即集合中没有找到,那么新开一个数组,tmp清零

否则将满足的元素取出
tmp值更新,b数组记录每个元素未排序之前的位置,并将当前元素对应的位置标记上为第几天,然后将该元素从集合中删除

其实就是在集合中不断找最小的能够满足数,满足就把当前的数接在这个元素之后,并把找到的元素删除

// Author: zengyz
// 2025-06-07 10:59

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;
struct Node
{
  int val, id;
  bool operator<(const Node &b) const
  {
    if (val == b.val)
      return id < b.id;
    else
      return val < b.val;
  }
  Node(int _val, int _id)
  {
    val = _val, id = _id;
  }
};
set<Node> st;

const int N = 2e5 + 10;
int a[N];
int b[N];
map<int, int> ans;
void solve()
{
  int n, m, d;
  cin >> n >> m >> d;
  for (int i = 1; i <= n; i++)
  {
    int num;
    cin >> num;
    st.insert(Node(num, i));
  }
  i64 tmp = 0, day = 1;
  while (!st.empty())
  {
    if (st.lower_bound(Node(tmp, -1)) == st.end())
    {
      tmp = 0;
      day++;
    }
    else
    {
      auto it = *st.lower_bound(Node(tmp, -1));
      tmp = it.val + d + 1;
      b[it.id] = day;
      st.erase(it);
    }
  }
  cout << day << endl;
  for (int i = 1; i <= n; i++)
    cout << b[i] << " ";
  return;
}

int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  int _T = 1;
  // cin >> _T;
  while (_T--)
  {
    solve();
  }
  return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2404616.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

榕壹云健身预约系统:多门店管理的数字化解决方案(ThinkPHP+MySQL+UniApp实现)

随着全民健身热潮的兴起&#xff0c;传统健身房在会员管理、课程预约、多门店运营等方面面临诸多挑战。针对这一需求&#xff0c;我们开发了一款基于ThinkPHPMySQLUniApp的榕壹云健身预约系统&#xff0c;为中小型健身机构及连锁品牌提供高效、灵活的数字化管理工具。本文将详细…

QUIC——UDP实现可靠性传输

首先我们要知道TCP存在什么样的痛点问题 TCP的升级很困难TCP建立连接的延迟网络迁移需要重新建立连接TCP存在队头阻塞问题 QUIC就是为了解决以上的问题而诞生了, 下面我会介绍QUIC的一些特性和原理 QUIC对比TCP优势: 握手建连更快 QUIC内部包含了TLS, 它在自己的帧会携带TL…

快速上手shell脚本运行流程控制

一、条件运行流程控制 1.if单分支结构 #!/bin/bash if [ 条件 ] then动作1动作2... fi 2.if双分支结构 ​ #!/bin/bash if [ 条件 ] then动作1动作2... else动作1动作2... fi​ 3.if多分支结构 二、循环运行流程控制 1.无判定for循环 给网卡一键添加5个IP 2.判断循环 while…

10.Linux进程信号

1. 理解信号 信号VS信号量 老婆&#xff1a;老婆饼-》没有任何关系&#xff01;信号&#xff1a;闹钟&#xff0c;上课铃声&#xff0c;脸色...人-》进程&#xff1b;信号中断人正在做的事&#xff0c;是一种事件的异步通知机制&#xff1b; 我们自习一会&#xff0c;等张三回…

机器学习基础(四) 决策树

决策树简介 决策树结构&#xff1a; 决策树是一种树形结构&#xff0c;树中每个内部节点表示一个特征上的判断&#xff0c;每个分支代表一个判断结果的输出&#xff0c;每个叶子节点代表一种分类结果 决策树构建过程&#xff08;三要素&#xff09;&#xff1a; 特征选择 选…

CentOS 7如何编译安装升级gcc至7.5版本?

CentOS 7如何编译安装升级gcc版本? 由于配置CentOS-SCLo-scl.repo与CentOS-SCLo-scl-rh.repo后执行yum install -y devtoolset-7安装总是异常&#xff0c;遂决定编译安装gcc7.5 # 备份之前的yum .repo文件至 /tmp/repo_bak 目录 mkdir -p /tmp/repo_bak && cd /etc…

为什么React列表项需要key?(React key)(稳定的唯一标识key有助于React虚拟DOM优化重绘大型列表)

文章目录 1. **帮助 React 识别列表项的变化**2. **性能优化**3. **避免组件状态混乱**4. **为什么使用 rpid 作为 key**5. **不好的做法示例**6. **✅ 正确的做法** 在 React 中添加 key{item.rpid} 是非常重要的&#xff0c;主要有以下几个原因&#xff1a; 1. 帮助 React 识…

飞牛云一键设置动态域名+ipv6内网直通访问内网的ssh服务-家庭云计算专家

IPv6访问SSH的难点与优势并存。难点主要体现在网络环境支持不足&#xff1a;部分ISP未完全适配IPv6协议&#xff0c;导致客户端无法直接连通&#xff1b;老旧设备或工具&#xff08;如Docker、GitHub&#xff09;需额外配置才能兼容IPv6&#xff0c;技术门槛较高&#xff1b;若…

Java高级 | 【实验七】Springboot 过滤器和拦截器

隶属文章&#xff1a;Java高级 | &#xff08;二十二&#xff09;Java常用类库-CSDN博客 系列文章&#xff1a;Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot 静…

深入理解 Spring IOC:从概念到实践

目录 一、引言 二、什么是 IOC&#xff1f; 2.1 控制反转的本质 2.2 类比理解 三、Spring IOC 的核心组件 3.1 IOC 容器的分类 3.2 Bean 的生命周期 四、依赖注入&#xff08;DI&#xff09;的三种方式 4.1 构造器注入 4.2 Setter 方法注入 4.3 注解注入&#xff08;…

行为设计模式之Command (命令)

行为设计模式之Command &#xff08;命令&#xff09; 前言&#xff1a; 需要发出请求的对象&#xff08;调用者&#xff09;和接收并执行请求的对象&#xff08;执行者&#xff09;之间没有直接依赖关系时。比如遥控器 每个按钮绑定一个command对象&#xff0c;这个Command对…

NeRF 技术深度解析:原理、局限与前沿应用探索(AI+3D 产品经理笔记 S2E04)

引言&#xff1a;光影的魔法师——神经辐射场概览 在前三篇笔记中&#xff0c;我们逐步揭开了 AI 生成 3D 技术的面纱&#xff1a;从宏观的驱动力与价值&#xff08;S2E01&#xff09;&#xff0c;到主流技术流派的辨析&#xff08;S2E02&#xff09;&#xff0c;再到实用工具的…

法律大语言模型(Legal LLM)技术架构

目录 摘要 1 法律AI大模型技术架构 1.1 核心架构分层 1.2 法律知识增强机制 2 关键技术突破与对比 2.1 法律专用组件创新 2.2 性能对比(合同审查场景) 3 开发部署实战指南 3.1 环境搭建流程 3.2 合同审查代码示例 4 行业应用与挑战 4.1 典型场景效能提升 4.2 关…

第六十二节:深度学习-加载 TensorFlow/PyTorch/Caffe 模型

在计算机视觉领域,OpenCV的DNN(深度神经网络)模块正逐渐成为轻量级模型部署的利器。本文将深入探讨如何利用OpenCV加载和运行三大主流框架(TensorFlow、PyTorch、Caffe)训练的模型,并提供完整的代码实现和优化技巧。 一、OpenCV DNN模块的核心优势 OpenCV的DNN模块自3.3…

MobaXterm配置跳转登录堡垒机

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 背景操作步骤 背景 主要是为了能通过MobaXterm登录堡垒机&#xff0c;其中需要另外一台服务器进行跳转登录 操作步骤 MobaXterm登录堡垒机的操作&#xff0c;需…

零基础在实践中学习网络安全-皮卡丘靶场(第八期-Unsafe Filedownload模块)

这期内容更是简单和方便&#xff0c;毕竟谁还没在浏览器上下载过东西&#xff0c;不过对于url的构造方面&#xff0c;可能有一点问题&#xff0c;大家要多练手 介绍 不安全的文件下载概述 文件下载功能在很多web系统上都会出现&#xff0c;一般我们当点击下载链接&#xff0c…

[面试精选] 0104. 二叉树的最大深度

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点…

图上合成:用于大型语言模型持续预训练的知识合成数据生成

摘要 大型语言模型&#xff08;LLM&#xff09;已经取得了显著的成功&#xff0c;但仍然是数据效率低下&#xff0c;特别是当学习小型&#xff0c;专业语料库与有限的专有数据。现有的用于连续预训练的合成数据生成方法集中于文档内内容&#xff0c;而忽略了跨文档的知识关联&a…

现代简约壁炉:藏在极简线条里的温暖魔法

走进现在年轻人喜欢的家&#xff0c;你会发现一个有趣的现象&#xff1a;家里东西越来越少&#xff0c;颜色也越看越简单&#xff0c;却让人感觉特别舒服。这就是现代简约风格的魅力 —— 用最少的元素&#xff0c;打造最高级的生活感。而在这样的家里&#xff0c;现代简约风格…

机器学习×第二卷:概念下篇——她不再只是模仿,而是开始决定怎么靠近你

&#x1f380;【开场 她不再只是模仿&#xff0c;而是开始选择】 &#x1f98a; 狐狐&#xff1a;“她已经不满足于单纯模仿你了……现在&#xff0c;她开始尝试预测你会不会喜欢、判断是否值得靠近。” &#x1f43e; 猫猫&#xff1a;“咱们上篇已经把‘她怎么学会说第一句…