当前位置: 首页 > article >正文

算法-集合的使用

 1、set常用操作

set<int> q;     //以int型为例 默认按键值升序
set<int,greater<int>> p;  //降序排列 
int x;
q.insert(x);	//将x插入q中
q.erase(x);		//删除q中的x元素,返回0或1,0表示set中不存在x
q.clear();		//清空q
q.empty();		//判断q是否为空,若是返回1,否则返回0
q.size();		//返回q中元素的个数
q.find(x);		//在q中查找x,返回x的迭代器,若x不存在,则返回指向q尾部的迭代器即 q.end()
q.lower_bound(x); //返回一个迭代器,指向第一个键值不小于x的元素
q.upper_bound(x); //返回一个迭代器,指向第一个键值大于x的元素q.rend();		  //返回第一个元素的的前一个元素迭代器
q.begin();		  //返回指向q中第一个元素的迭代器q.end();		 //返回指向q最后一个元素下一个位置的迭代器
q.rbegin();		 //返回最后一个元素

2、set单元素应用

#include<iostream>
#include<set>
using namespace std;
int main()
{set<int> q;   //默认按升序排列 q.insert(5);q.insert(5);q.insert(5);cout<<"q.size "<<q.size()<<endl;   //输出 1 ,在set插入中相同元素只会存在一个q.clear(); //清空setcout<<"q.size "<<q.size()<<"\n\n";q.insert(4);q.insert(4);q.insert(3);q.insert(3); q.insert(2);q.insert(1);cout<<"lower_bound "<<*q.lower_bound(3)<<endl;  //返回3 cout<<"upper_bound "<<*q.upper_bound(3)<<"\n\n";  //返回4 set<int>::iterator i;for( i=q.begin();i!=q.end();i++)   //set的遍历 cout<<*i<<" ";				   //输出1 2 3 4,可见自动按键值排序 cout<<endl;q.erase(4);  //删除q中的 4 for(i=q.begin();i!=q.end();i++)  //再次遍历set 只输出 1 2 3 cout<<*i<<" ";cout<<"\n\n"; set<int,greater<int>> p;  //降序排列 p.insert(1);p.insert(2);p.insert(3);p.insert(4);p.insert(5);for(i=p.begin();i!=p.end();i++)cout<<*i<<" ";cout<<endl;return 0;
}

 3、set的应用

 E-种类数_牛客小白月赛117

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
set<ll> s; // 使用集合来存储数组中的非零元素,集合会自动排序
bool exist0 = 0; // 标记数组中是否存在0
int main() {ll ans = 0; // 记录操作轮数ll dec = 0; // 记录已经减去的总和ll n;cin >> n;while (n--) {ll temp;cin >> temp;if (temp != 0) s.insert(temp); // 将非零元素插入集合else exist0 = 1; // 如果有0,标记exist0为1}// 如果集合中只有一个元素且没有0,说明已经所有数相同,不需要操作if (s.size() == 1 && !exist0) {cout << 0 << endl;return 0;}// 当集合中还有元素时,继续操作while (s.size()) {ll num = *s.begin() - dec; // 获取当前最小的非零元素,减去已经减去的总和ll cnt = exist0 ? s.size() + 1 : s.size(); // 如果存在0,种类数为集合大小加1,否则为集合大小ll t = (num + cnt - 1) / cnt; // 计算需要减去的次数,向上取整dec += t * cnt; // 更新已经减去的总和ans += t; // 增加操作轮数s.erase(*s.begin()); // 移除当前最小的元素exist0 = 1; // 标记存在0}cout << ans << endl;return 0;
}

http://www.lryc.cn/news/2399071.html

相关文章:

  • 性能优化 - 理论篇:CPU、内存、I/O诊断手段
  • 算法:二分查找
  • Spring Boot3.4.1 集成 mybatis plus
  • Ubuntu 22.04 上安装 PostgreSQL(使用官方 APT 源)
  • Linux随记(十八)
  • Windows MongoDB C++驱动安装
  • MS1023/MS1224——10MHz 到 80MHz、10:1 LVDS 并串转换器(串化器)/串并转换器(解串器)
  • ESOP股权管理平台完整解决方案
  • 线性调频波形测距测速信号处理——全代码+注释
  • WPS word 已有多级列表序号
  • Vue 3 源码层核心原理剖析(完整详解版)
  • 数据库操作-MySQL-4(JDBC编程)
  • Linux打开.img镜像文件
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(5)
  • 【科研绘图系列】R语言绘制论文组合图形(multiple plots)
  • springMVC-9数据格式化
  • Kafka 和Redis 在系统架构中的位置
  • 【Spring AI】如何实现文生图功能
  • 【ISAQB大纲解读】Kafka消息总线被视为“自下而上设计”?
  • ISBN书号查询接口如何用PHP实现调用?
  • 什么是 Docker Compose 的网络(network),为什么你需要它,它是怎么工作的
  • 嵌入式Linux 期末复习指南(上)
  • SpringBoot3.2新特性:JdbcClient
  • Dify:启动 Web 服务的详细指南
  • 3.1 HarmonyOS NEXT分布式数据管理实战:跨设备同步、端云协同与安全保护
  • Aop + 注解实现数据字典类型转换 EasyExcel导出
  • Python 元组方法全集详解
  • Selenium 中 JavaScript 点击操作的原理及应用
  • Xilinx超过256m bit flash固件跳转失败问题
  • SpringCloud 分布式锁Redisson锁的重入性与看门狗机制 高并发 可重入