博主介绍: 27dCnc
专题 : 算法题入门
☆*: .。. o(≧▽≦)o .。.:*☆
今日份打卡
题目考点 : STL
map
哈希表
基础语言条件判断
详细思路
运用哈希表去储存出现的次数然后再统计出现次数
最中要的的是情况判断:
1. 如果统计的数字出现次数大于我们数字本身,减去多余部分
2. 小于数字本身 减去所有出现数字
代码 :
#include
#define Run 0
#define endl "\n"
#define N 105
using ll = long long;
using namespace std;
void slove() {
int n;cin >> n;
map<int,int>mp;
int a[n + 5];
int ans = 0;
for (int i = 0; i < n; i++) { cin >> a[i]; mp[a[i]]++; }
for (auto& [x,y] : mp) { //x带表当前数字 , y代表当前数字出现的次数
if (y > x) ans += (y - x); //如果当前数字出现次数大于 我们数字 减去多余部分
if (y < x) ans += y; // 如果当前出现次数小于数字 减去我们所有出现数字
}
cout << ans;
}
int main() {
cin.tie(0) -> ios::sync_with_stdio(0);
cout.tie(0) -> ios::sync_with_stdio(0);
#if Run
int _;cin>>_;while(_--) slove();
#else
slove();
#endif
return 0;
}
题目考点 : 模拟
思维
代码
#include
using namespace std;
const int Day[] = {31,28,31,30,31,30,31,31,30,31,30,31};
void slove(){
int ans = 0;
for(int month = 1;month<=12;month++){
int a = month / 10,b = month % 10;
for(int day = 1;day <= Day[month-1];day++){
int c = day / 10,d = day % 10;
if(b + 1 == c) {
if(a + 1 == b || c + 1 == d) {
ans++;
}
}
}
}
cout<<ans<<endl;
}
int main(){
int T = 1;
while(T--) slove();
}
pair 包含两种类型 两种类型 可以
不同
用于组成键值对 俩个参数变量fist
和second
pair类还有一些成员函数和特性,例如默认构造函数、节带参数的构造函数、比较运算符重载等
piar实例
以上代码创建了两个pair对象,分别包含不同类型的值。然后,通过访问first和second成员变量,输出了这些值
pair嵌套
pair可以进行嵌套,也就是说可以将一个pair对象作为另一个pair对象的成员通过嵌套pair,你可以方便地组合多个值,并形成更复杂的数据结构。例如,你可以创建一个三维坐标系的点,其中第1个维度由一个整数表示,第2、3个维度由一个pair表示。
pair自带的排序规则
pair自带的排序规则是按照first成员进行升序排序。如果first成员相等,则按照second成员进行升序排序,这意味着当你使用标准库中的排序算法(如std::sort)又对包含pair对象的容器进行排序时会根据pair对象的first成员进行排序。
可以自定义比较函数
其中 T 代表类型
template< typename T>
容器大小: vector 是动态数组可以根据需要自动调节容器大小
元素访问 : 可以使用索引访问数组元素 从 0 开始 最后一个元素的索引是 size() - 1 ,用 [] (方括号) 或者 at() 来访问元素
PS : size()返回的的是uint 类型 如果vector为空 - 1 会得到很大的数 越界
一般for循环< size()
而不是<= size() - 1
元素的添加和删除
- 使用
push_back()
在vector的末尾添加元素 , 使用- 使用
pop_back()
在元素末尾删除元素- 使用
insert()
在指定位置插入元素- 使用
erase()
删除指定位置的元素
容器大小管理 :
size()
获取 vector 中的元素数量empty()
检查 vector 是否为空resize()
重新定义 vector 大小迭代器
begin()
end
vector常用函数
注意 : 在 pop_back()
时vector 为非空
vector排序去重
代码示例
经典去重语句
numbers.erase(std::unique(numbers.begin(), numbers.end()), numbers.end());
定义和结构
ist的使用频率不高,在做题时几乎遇不到需要使用list的情景。
list是一种双向链表容器,它是标准模板库(STL)提供的一种序列容器。1ist容器以节点(node)的形式存储元素,并使用指针将这些节点链接在一起,形成一个链表结构。list容器结构如下:
具有双向性 : 有 prev
和 next
内存地址不连续,插入删除元素不导致元素移动
示例
访问查找为 O ( n ) O(n) O(n)
查找为 O ( 1 ) O(1) O(1)
list常用函数
stack 的定义和结构
stack是一种后进先出(LIFO)的数据结构,使用前需要包含头文件stack提供了一组函数来操作和访问元素,但它的功能相对较简单。stack的定义和结构如下(仅作了解即可):
结构
stack 的常用函数
小tips:如果将一个数组的元素依次放入栈,再依次取出,则可以将数组翻转。
priority_queue与普通队列不同,priority_queue中的元素是按照一定的优先级进行排序的。默认情况下,priority_queue按照元素的值从大到小进行排序,即最大元素位于队列的前面。priorityqueue的定义和结构如下(仅做了解即可)
例题讲解 CLZ 银行问题
题目考点 : 队列
#include
#define Run 1
using namespace std;
queue<string> V, N;
void slove()
{
string op;
cin >> op;
if (op == "IN")
{
string name, s;
cin >> name >> s;
if (s == "V")
{
V.push(name);
}
else
{
N.push(name);
}
}
else
{
string s;
cin >> s;
if (s == "V")
V.pop();
else
N.pop();
}
}
template <typename T>
void print(T V)
{
while (V.size())
{
cout << V.front() << "\n";
V.pop();
}
}
int main()
{
cin.tie(0)->sync_with_stdio(0);
cout.tie(0)->sync_with_stdio(0);
#if Run
int _;
cin >> _;
while (_--)
slove();
print(V);
print(N);
#else
slove()
#endif
return 0;
}
set 定义
set 内部实现使用红黑树
当插入重复元素set 会自动忽略
常用函数
修改set的方法
st.erase(st.find(x))
代码示例
set
multiset
unordered_set
基础
常用函数
count
可以判断元素是否存在
常用函数
如果此文对你有帮助的话,欢迎关注、点赞、⭐收藏、✍️评论,支持一下博主~