accumulate
int sum = accumulate(vec.begin() , vec.end() , 42);
accumulate带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值。
sort
sort(begin, end, cmp)
其中begin为指向待sort()的数组的第一个元素的指针,end为指向待sort()的数组的最后一个元素的下一个位置的指针,cmp参数为排序准则,如果没有的话,默认以非降序排序。
begin,end,rbegin,rend
C++中string类下的begin,end,rbegin,rend的用法
begin()函数返回一个迭代器,指向字符串的第一个元素.
end()函数返回一个迭代器,指向字符串的末尾(最后一个字符的下一个位置).
rbegin()返回一个逆向迭代器,指向字符串的最后一个字符。
rend()函数返回一个逆向迭代器,指向字符串的开头(第一个字符的前一个位置)。
一个贪心算法求最短数列比数列外其他数和大的例子
class Solution {
public:
vector<int> minSubsequence(vector<int>& a) {
int sum=accumulate(a.begin(),a.end(),0);//数列a的全部和
sort(a.rbegin(),a.rend());//逆序排序 从大到小
vector<int> res;
int pre=0;
for(int x:a)
{
res.push_back(x);
pre+=x,sum-=x;
if(pre>sum)break;
}
return res;
}
};
pair的用法
pair<T1, T2> p1; //创建一个空的pair对象(使用默认构造),它的两个元素分别是T1和T2类型,采用值初始化。
pair<T1, T2> p1(v1, v2); //创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v1,second成员初始化为v2。
p1.first; // 返回对象p1中名为first的公有数据成员
p1.second; // 返回对象p1中名为second的公有数据成员
ccf例题 202009-1称检测点查询
解答 使用了sort和pair
#include<iostream>
#include<algorithm>
//pair的应用
using namespace std;
pair<int,int> pii[205];
bool cmp(pair<int,int>a,pair<int,int> b){
if(a.second == b.second)
return a.first<b.first;
return a.second<b.second;
}
int main()
{
int n,X,Y;
cin>>n>>X>>Y;
for(int i=1;i<=n;i++){
int x,y;
cin>>x>>y;
pii[i].first=i;
pii[i].second=(x-X)*(x-X)+(y-Y)*(y-Y);
}
sort(pii+1,pii+1+n,cmp);//cmp是排序规则
for(int i=1;i<=3;i++){
cout<<pii[i].first<<endl;
}
return 0;
}
>> <<
右移操作符>> 相当于缩小为1/2
左移操作符<< 相当于扩大为2倍
& |
&有按位与的作用 相当于取交集
|表示或,相当于取并集