06STL(蓝桥杯C/C++基础知识)

vector动态数组

头文件:#include<vector>

定义:vector<int> vec:名为vec的存储int型的动态数组

push_back():在最后插入一个新元素

vector_size():长度(可用[ ]直接访问vector中的元素)

pop_back():在最后删除一个元素

clear():清空vector,但不会清空开的内存

构造函数:

一维动态数组:vector<int> vec(n,1)

n表示初始的动态数组的长度,1表示初始的数组里每个元素的值,不传入参数,默认为0。

二维动态数组:vector<vector<int> > vec2

 每一维都是空的,要一维一维地赋值。

map映射

头文件:#include<map>

定义:两个集合之间的元素的相互对应关系,关键字集合(key)到值集合(value)

map<string,int>  m:字符串映射为整数

1.insert():插入一个新的映射,参数是一个pair。

注意:pair来自标准库,头文件为<utility>,默认已经重载“<”。内含有两个参数,第一个参数为first,第二个参数为second。

初始化:make_pair< string , int > p

若key已存在,则不会插入新的value值;若插入key后,value值未插入,则生成默认值。

2.count():判断关键字是否存在

3.clear():清空map以及其所占用内存

4.size():获取映射对个数

 二维:map+set、map+map

stack栈 

头文件:#include<stack>

定义:先进后出、后进先出

stack<T>  s:类型为T的栈s

push():压入元素到栈顶

pop():弹出栈顶元素

top():获取栈顶元素,并且返回栈顶元素

empty():判断栈是否为空

size():计算栈中元素的个数

火车进站问题 

#include<iostream>
#include<vector>
#include<stack>
using namespace std;
int n;
int cur = 1;
bool f = 1;
stack<int> s;
int main()
{
    cin >> n;
    vector<int> a(n);
    for(int i = 0; i < n; i++)
        cin >> a[i];
    for(int i = 0; i < n; i++)
    {
        while((s.empty() || s.top() != a[i]) && cur <= n)
        {
            s.push(cur);
            cur++;
        }
        if(s.empty() || s.top() != a[i])
        {
            f = 0;
            break;
        }
        else 
        {
            s.pop();
        }
    }
    if(f) 
        cout << "legal" << endl;
    else 
        cout << "illegal" << endl;
    return 0;
}

题目

洛谷P1102 A-B 数对(map)

题目描述

给出一串正整数数列以及一个正整数C,要求计算出所有满足A−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。

输入格式

输入共两行。

第一行,两个正整数N,C。

第二行,N 个正整数,作为要求处理的那串数。

输出格式

一行,表示该串正整数中包含的满足A−B=C 的数对的个数。

思路

首先将A-B=C转换成A-C=B。

再将A数组每个元素出现的次数统计起来,用map映射。

最后将A数组每次减一个C,再将A数组扫一遍,将所有映射的次数和加起来就是答案

题解

#include <iostream>
#include <map>
using namespace std;
typedef long long LL;
LL a[200001];
int n;
LL c,ans;
map<LL,LL> m;//建立一个数字到出现次数的映射 map<num,times>
//A-B=C --> A-C=B
int main()
{
    cin >> n >> c;
    for(int i=1;i<=n;i++) 
	{
        cin >> a[i];
    	m[a[i]]++;
        a[i]-=c;    
    } 
    for(int i=1;i<=n;i++) ans+=m[a[i]];
    cout << ans << endl;
    return 0;
}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值