STL:
upper_bound和 lower_bound
-
upper_bound(begin,end,value);
返回>value的元素的第一个位置 -
lower_bound(begin,end,value);
返回>=value的元素的第一个位置num[]={1,2,2,3,4,5};
-
lower_bound(num,num+6,2)为num+1
-
upper_bound(num,num+6,2) 为num+3
-
应为有序队列,返回的为地址值,若找不到返回值为-1.
set和multiset的应用
- s.insert(elem)--安插一个elem副本,返回新元素位置。
- s.erase(elem)--移除与elem元素相等的所有元素。返回被移除的元素个数。
- s.srase(pos)--移除迭代器pos所指位置上的元素,无返回值。
- s.clear()--移除全部元素,将整个容器清空。
****迭代器例子:****
- multiset<int>::iterator pos;
for(pos=s.begin();pos!=s.end();pos++)
- s.size()--返回容器大小。
- s.empty()--返回容器是否为空。
- s.count(elem)--返回元素值为elem的元素的个数。
----迭代器
- s.begin()–返回一个双向迭代器,指向第一个元素。
- s.end()–返回一个双向迭代器,指向最后一个元素的下一个位置。
map和multimap的应用
头文件:#include<map>
定义:map<data type1,date type2>map_name;
如:map<string ,int>默认为按string 由小到大排序
m.size()返回容器大小
m.empty()返回容器是否为空
m.count(key)返回值等于key的元素个数
-
m.upper_bound(begin,end,value);
返回等于k值的元素的第一个可安插的位置 -
lower_bound(begin,end,value);
返回等于k值的元素的最后一个可安插的位置
训练部分题解
较简单的贪心问题,求最少拿多少枚硬币可以比另外一个姐妹总金额要大,可以先求出总金额,将硬币面额降序排列,当拿到超过总数1/2的时候,停止,输出。
代码如下:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int cnt,sum,sum2;
bool camp1(int x,int y){
return x>y;}
int main()
{
int n,a[10005];
cin>>n;
for(int i=0;i<n;i++)
{cin>>a[i];
sum+=a[i];
}
sort(a,a+n,camp1);
for(int i=0;i<n;i++)
{
sum2+=a[i];
cnt++;
if(sum2>sum/2)
break;
}
cout<<cnt;
}
贪心2
-勇者斗恶龙,也是一个较为简单贪心的问题,每条龙都有力量值和给勇者带来的收益,合理安排顺序,击败所有的龙。可以定义一个结构体,把龙的力量值和收益写在里面,将龙的力量值按升序排列,依次挑战.
代码如下:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int cnt;//勇者胜利次数
struct dragon{
long long int a;//力量
long long int b;//收益
}p[100000];
bool camp1(dragon x,dragon y)
{
return x.a<y.a;
}//按照龙的力量值升序排列
int main()
{
long long int s,n;
cin>>s>>n;
for(int i=0;i<n;i++)
{
cin>>p[i].a>>p[i].b;
}
sort(p,p+n,camp1);
for(int i=0;i<n;i++)
{
if(s>p[i].a)
{
s+=p[i].b;
cnt++;
}
else break;//失败一次退出循环
}
if(cnt==n)//龙的数量等于赢得次数
cout<<"YES";
else cout<<"NO";
}
总结:
学习了许多新知识,但对于新知识的运用还不太熟练,今后要将新知识多运用到题目上,多写几种题解。