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

算法-集合的使用

 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.lqws.cn/news/84943.html

相关文章:

  • 统计字符数
  • 知识图谱系列(5):表示学习
  • 【Linux】pthread多线程基础
  • 【python深度学习】Day43 复习日
  • RNN循环网络:给AI装上“记忆“(superior哥AI系列第5期)
  • 快手可灵视频V1.6模型API如何接入免费AI开源项目工具
  • gcc编译构建流程-函数未定义问题
  • UE特效Niagara性能分析
  • 数据资产评估进阶:精读资产评估专家指引第9号——数据资产评估指导【附全文阅读】
  • 【Godot引擎】如何使用内置的全局搜索功能提升开发效率
  • selenium-自动更新谷歌浏览器驱动
  • Redis-6.2.9 cluster集群部署和扩容缩容
  • bismark OT CTOT OB CTOB 以及mapping后的bam文件中的XG,XR列的含义
  • 调试的本质:从混沌走向秩序
  • 双指针题解——反转字符串中的单词【LeetCode】
  • FastAPI安全认证:从密码到令牌的魔法之旅
  • 嵌入式Linux 期末复习指南(下)
  • Mysql水平分表(基于Mycat)及常用分片规则
  • Spring 5 响应式编程:构建高性能全栈应用的关键
  • hooks组件-useState
  • 吴恩达机器学习笔记(1)—引言
  • 设计模式——访问者设计模式(行为型)
  • wow Warlock shushia [Dreadsteed]
  • 地图 APP 和购物 APP 是最急切上 AI的地方
  • Artificial Analysis2025年Q1人工智能发展六大趋势总结
  • ThreadLocal ,底层原理,强引用,弱引用,内存泄漏
  • Vue3(watch,watchEffect,标签中ref的使用,TS,props,生命周期)
  • FastAPI+Pyomo实现线性回归解决饮食问题
  • 函数调用的机器级实现(二):栈帧的访问与切换机制
  • 极客时间:用 FAISS、LangChain 和 Google Colab 模拟 LLM 的短期与长期记忆