2020年3月第二周学习心得

 

学习总结

栈(stack)

先进后出,单一操作端;

头文件#include

定义:stack stack_name;  例如:stack s;

操作:

  • empty() -- 返回bool型,表示栈内是否为空 (s.empty() )
  •  size() -- 返回栈内元素个数 (s.size() )
  •   top() -- 返回栈顶元素值 (s.top() )
  •   pop() -- 移除栈顶元素(s.pop(); )
  •   push(data_type a) -- 向栈压入一个元素 a(s.push(a); )

队列(queue)

先进先出,低入顶出;

头文件#include

定义:queue queue_name;  例如:queue q;

操作:

  •   empty() -- 返回bool型,表示queue是否为空 (q.empty() )
  •   size() -- 返回queue内元素个数 (q.size() )
  •   front() -- 返回queue内的下一个元素 (q.front() )
  •   back() -- 返回queue内的最后一个元素(q.back() )
  •   pop() -- 移除queue中的一个元素(q.pop(); )
  •   push(data_type a) -- 将一个元素a置入queue(q.push(a); )

vector(动态数组)

头文件#include

定义:vector vector_name;  例如:vector v;

操作:

  •   empty() -- 返回bool型,表示vector是否为空 (v.empty() )
  •   size() -- 返回vector内元素个数 (v.size() )
  •   push_back(data_type a) 将元素a插入最尾端
  •   pop_back() 将最尾端元素删除
  •   v[i] 类似数组取第i个位置的元素(v[0] )
  •  

map

map所有元素都是pair,分为键值+实值;

头文件#include

操作:

  • m.size() 返回容器大小
  • m.empty() 返回容器是否为空
  • m.count(key) 返回键值等于key的元素的个数
  • m.lower_bound(key) 返回键值等于key的元素的第一个可安插  的位置
  • m.upper_bound(key) 返回键值等于key的元素的最后一个可安  插的位置

迭代器(iterator)

迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。除了使用下标来访问 vector 对象的元素外,标准库还提供了另一种访问元素的方法:使用迭代器(iterator)。迭代器是一种检查容器内元素并遍历元素的数据类型。

标准库为每一种标准容器(包括vector)定义了一种迭代器类型。迭代器类型提供了比下标操作更通用化的方法:所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。因为迭代器对所有的容器都适用,现代 C++ 程序更倾向于使用迭代器而不是下标操作访问容器元素,即使对支持下标操作的vector 类型也是这样。

容器的类型:

每种容器类型都定义了自己的迭代器类型,如vector:

 vector::iterator iter;

这符语句定义了一个名为 iter 的变量,它的数据类型是 vector 定义的 iterator 类型。每个标准库容器类型都定义了一个名为 iterator 的成员,这里的 iterator 与迭代器实际类型的含义相同。

 

由于此前并未使用过迭代器,对于此部分内容还过于生疏,再查询详细资料并进行理解。

​​​​​​​问题解决

为证实map输入后的顺序,我写了一小段代码,虽然没有技术含量,但是也可以加深记忆便于理解

#include
#include
using namespace std;
int main()
{
    mapa;
    a["aaa"]=1;
    a["ccc"]=2;
    a["bbb"]=3;
    map::iterator pos;
    pos=a.find("aaa");
    for(;pos!=a.end();pos++)
    {
        cout<first<<"  "<second<

由此可见,map会对string类型的键值按字典序自动排序,自然键值与实值为对应关系,会一并排序。

电池的寿命

小S新买了一个掌上游戏机,这个游戏机由两节5号电池供电。使用寿命也有所不同,有的能使用5个小时,有的可能就只能使用3个小时。显然如果他只有两个电池一个能用5小时一个能用3小时,那么他只能玩3个小时的游戏,有一个电池剩下的电量无法使用,但是如果他有更多的电池,就可以更加充分地利用它们,分别能用3、3、5小时,他可以先使用两节能用3个小时的电池,使用半个小时后再把其中一个换成能使用5个小时的电池,两个半小时后再把剩下的一节电池换成刚才换下的电池(那个电池还能用2.5个小时),这样总共就可以使用5.5个小时,没有一点浪费。

现在已知电池的数量和电池能够使用的时间,请你找一种方案使得使用时间尽可能的长。

输入

输入包含多组数据。每组数据包括两行,第一行是一个整数N (2 ≤ N ≤ 1000),表示电池的数目,接下来一行是N个正整数表示电池能使用的时间。

输出

对每组数据输出一行,表示电池能使用的时间,保留到小数点后1位。

样例输入

2
3 5
3
3 3 5

样例输出

3.0
5.5

 分析题目所给条件并举几个特殊例子之后就可以大概分析出本题可分为两种情况,对题目中所给的两个例子的情况可以得出:

  1. 在拥有的几块电池中有一块电池过强,导致其他所有电池都没电之后此电池还有余电,产生剩余(浪费)。
  2. 电池质量和健康状况差别不大,所有电池均可以耗完电量。

对上面两种情况进行分析之后,发现他们两者均存在显著特征,并对此特征加以判断:

  1. 当使用时间最长的电池超过了总使用时间的一半时,别人无法耗完它,此时就会产生浪费,所以有效使用时间就为其它电池的使用时间之和。
  2. 当最大者的使用时间不到总和的一半时,那除开它必定至少还有2个电池,那我们就可以让其余的电池打车轮战,直到把电量耗到与最大者相等,最后让二者耗完。此时无一点浪费,所以有效使用时间为总和的一半。

对于此题的解题思路就十分明了了,对于贪心思想也可有较好的理解。

#include
#include
#include
#include
#include
#include
#include
#include
//#define INF 0x3f3f3f3f
//typedef long long ll;
using namespace std;

int a[1000+10];
int main()
{
    int n;
    while(cin>>n)
    {
        int sum=0,max=0;
        for(int i=0;i>a[i];
            if(a[i]>max)
                max=a[i];
            sum+=a[i];
        }
        if(max>=sum-max)cout<

想法感悟

在家学习与在校学习差距还是蛮大的,面对一道又一道的难题,很宝贵的就是灵光一现的时刻,而在家学习最大的敌人就是自己,希望自己能继续加油战胜自己。另外希望疫情赶快结束尽快投入正常学习生活。

你可能感兴趣的:(笔记)