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;
}