3.15第三周


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

总结:
学习了许多新知识,但对于新知识的运用还不太熟练,今后要将新知识多运用到题目上,多写几种题解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值