CCF 201703-2 学生排队

参考https://blog.csdn.net/tigerisland45/article/details/66477733

上面的文章写了四种方法,十分佩服大佬这种思维程度。

关键点索引,STL,List(双向链表),Vector(容器)

有点看不懂上面文章里的方法二,知道个大概但是总是感觉有点懵,果断通过方式一自己写了一个带索引的解决方式。

#include<iostream>
using namespace std;
int pos2sno[1005];   // 位置上的学号
int sno2pos[1005];   // 学号所在位置
int main() {
    int n,m,p,q;
    cin >> n >>m;
    for(int i = 1 ; i <= n ; i++) {
        pos2sno[i] = i;
        sno2pos[i] = i;
    }
    for(int i = 1; i <=m ; i++) {
        cin >> p >> q;
        int pos = sno2pos[p];
        if(q>0) {
            for(int j = pos; j < pos+q ; j++) {
                pos2sno[j] = pos2sno[j+1];
                sno2pos[pos2sno[j]] = j;
            }
            pos2sno[pos+q] = p;
            sno2pos[p] = pos+q;
        } else {
            for(int j = pos; j > pos+q ; j--) {
                pos2sno[j] = pos2sno[j-1];
                sno2pos[pos2sno[j]] = j;
            }
            pos2sno[pos+q] = p;
            sno2pos[p] = pos+q;
        }
    }
    for(int i = 1 ; i <= n ; i++) {
        cout << pos2sno[i] <<" ";
    }
}

然后学习了一下List和Vector的用法和区别

需要记住的是LIst不能随意访问,只能从头或尾顺序访问。但是Vector可以。

迭代器的英文:iterator

 list 容器可用的成员函数
成员函数功能
begin() 返回指向容器中第一个元素的双向迭代器。
end() 返回指向容器中最后一个元素所在位置的下一个位置的双向迭代器。
rbegin() 返回指向最后一个元素的反向双向迭代器。
rend() 返回指向第一个元素所在位置前一个位置的反向双向迭代器。
cbegin() 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
cend() 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crbegin()  和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crend() 和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
empty() 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。
size() 返回当前容器实际包含的元素个数。
max_size() 返回容器所能包含元素个数的最大值。这通常是一个很大的值,一般是 232-1,所以我们很少会用到这个函数。
front() 返回第一个元素的引用。
back() 返回最后一个元素的引用。
assign() 用新元素替换容器中原有内容。
emplace_front() 在容器头部生成一个元素。该函数和 push_front() 的功能相同,但效率更高。
push_front() 在容器头部插入一个元素。
pop_front() 删除容器头部的一个元素。
emplace_back() 在容器尾部直接生成一个元素。该函数和 push_back() 的功能相同,但效率更高。
push_back() 在容器尾部插入一个元素。
pop_back() 删除容器尾部的一个元素。
emplace() 在容器中的指定位置插入元素。该函数和 insert() 功能相同,但效率更高。
insert()  在容器中的指定位置插入元素。
erase() 删除容器中一个或某区域内的元素。
swap() 交换两个容器中的元素,必须保证这两个容器中存储的元素类型是相同的。
resize() 调整容器的大小。
clear() 删除容器存储的所有元素。
splice() 将一个 list 容器中的元素插入到另一个容器的指定位置。
remove(val) 删除容器中所有等于 val 的元素。
remove_if() 删除容器中满足条件的元素。
unique() 删除容器中相邻的重复元素,只保留一个。
merge() 合并两个事先已排好序的 list 容器,并且合并之后的 list 容器依然是有序的。
sort() 通过更改容器中元素的位置,将它们进行排序。
reverse() 反转容器中元素的顺序。
 
   
posted @ 2022-05-01 16:13  夏莱发电厂的Sensei  阅读(32)  评论(0)    收藏  举报