一、双指针
严格的来说,双指针只能说是是算法中的一种技巧。
双指针指的是在遍历的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到题目的要求。
1.对撞指针就是将数组最左侧的元素定义为左指针(L),将数组最右侧的元素定义为右指针(R),然后两头向中间遍历数组。一般指针每次移动一个位置,结束条件为左指针与右指针逆向(L>R);
大致框架:
type name(int list[],int len)
{
int left = 0;
int right = len-1;
while(left>right)
{
left++;
//根据题目做一些判断,处理
right--;
}
}
2.快慢指针一般将慢指针初始值定为数组第一个元素每次向后移动一个位置,快指针一般初始值为第二个元素每次向后移动两个位置;结束条件:快慢指针重合或快指针到达数组最后一个位置。
注意:要判断快指针是否达到最后位置,否则可能会陷入死循环;
大致框架:
type name(int list[],int len)
{
int slow = 0;
int fast = 1;
while(left>right)
{
slow++;
//根据题目做一些判断,处理
fast+=2;
if(fast==len)//如果快指针到达最后位置结束循环
break;
}
}
二、STL容器中常见函数的用法
1.vector(使用时添加#<vector>头文件)
简单来说vector是一个可以根据需要自动变长的数组
(1)定义:vector<typename> name;
vector<typename> arrayname[arraysize];
//arrayname[0]~arrayname[arraysize-1]都有一个vector容器
vector<vector<typename>> name;
//相当于行和列都可自动变长的二维数组
(2)vector容器内的访问可以直接用name[0]等下表访问
也可用迭代器访问:
vector<typename>::iterator it; //此时可以通过*it访问vector中的元素
(3)vector中的常用函数
begin() //取vector容器首地址
end() //取vector容器中的尾元素后一个地址
push_back() //在vector末尾添加一个元素 用法:vectorName.push_back();
pop_back() //删除vector末尾元素 用法:vectorName.pop_back();
size() //获取vector的长度 用法:vectorName.size();
insert //在vector容器任意位置添加元素 用法:vectorName.insert(begin()+x,add);
clear() //清空vector容器中的元素 用法:vectorName.clear()
erase() //删除vector容器中某个位置或区间的元素
2.set(使用时添加#include<set>头文件)
翻译为集合,有自动去重并且按升序排列的功能
(1).set容器的定义使用方法即常见函数使用与vector基本相同,但是不同的是set容器只能通过迭代 器访问不能通过下标访问
(2).set中find函数的用法:
vectorName.find(value)返回的是set中对应value位置的迭代器即地址
例:set<int>::iterator it = vectorName.find(value);
printf("%d",*it);
3.map(使用时添加#include<map>头文件)
翻译为映射,例:a[0]=29,a[4]=22;即该数组就是0>29,4>22的映射,但是数组只能用于int>int型的映 射,而map可以用于任意两种类型的映射,而且map也会基于键的值升序排列
(1).定义:map<typename1,typename2> mapname;
(2) map可以通过下标访问,但map中的键是唯一的,当输入已存在的键时会将原来的值覆盖;
例:map<char,int> name0;
map['c']=20;
map['c']=30;
printf("%d",map['c']);
输出结果为30
map也可用迭代器访问,map可以使用it->first来访问键,it->second来访问值;
三.结构体
大致语法结构
struct student{
int ID;
string name;
struct teacher{ //可以在结构体中添加结构体
string name;
int age;
}name1
}name2;
赋值:
name2.ID = 19;
name2.name1.age = 18;
结构体数组,就是在数组中每一项都是一个结构体.
定义: struct name{
int age;
int size;
}name2[length];
sort比较排序函数,有三个参数前两个为需要排序的区间,最后一个为排序所用的函数,可以不给
例:
struct stu{
int age;
}name1[10];
bool cmp(stu a,stu,b)
{ return a.age >b.age};//从大到小排序
sort(stu,stu+10,cmp);
floor(),ceil(),round()分别对应向下取整,向上取整,四舍五入所用的函数
注意:floor()与ceil()返回的是double型数据,
例题:
洛谷T211372
#include<bits/stdc++.h>
using namespace std;
struct student{ //定义一个结构体数组存储数据
char name[10];
int qm;
int qm2;
int ps;
int zp;
int id;
}stu[100];
bool cmp(student a,student b)排序函数
{
if(a.zp==b.zp)
return a.id<b.id;
else
return a.zp>b.zp;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) //输入学生姓名,成绩
{
stu[i].id = i;
scanf("%s",&stu[i].name);
scanf("%d",&stu[i].ps);
scanf("%d",&stu[i].qm);
stu[i].qm2 = (int)ceil(sqrt(stu[i].qm)*10.0);//ceil返回的是double类型,强转为int型
stu[i].zp = round(stu[i].ps*0.4+stu[i].qm2*0.6);//处理后的总评成绩
}
sort(stu,stu+n,cmp);//从大到小排序
for(int i=0;i<n;i++)//输出排序后的结果
{
printf("%s %d\n",stu[i].name,stu[i].zp);
}
return 0;
}