信息学奥赛第十二节 —— vector解决排序、vector解决约瑟夫问题、迭代器

复习vector —— 原题链接

题目描述

给定N个数组,要求先对这N个数组分别进行排序,然后再根据N的数组的字典序对这N个数组进行排序。输出排序的结果。

输入

第一行一个整数N,表示数组数。
接下来N(N≤1000)行,每一行先包含一个整数C(C≤1000),表示数组的大小,接下来C个整数,表示数组中的一个元素。

输出

共N行,每行表示一个数组。

样例输入

4
1 3
1 1
2 2 1
3 2 3 1

AC代码

#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;
const int N = 1010;
vector<int> a[N];//理解为一个二维数组,数组的每一行都是一个vector

int main()
{
    int T; cin >> T; //T组数据
    for (int i = 0;i < T;i++)
    {
        int n; cin >> n;//n表示每个vector中元素的个数
        for (int j = 0;j < n;j++) 
        {
            int x; cin >> x;
            a[i].push_back(x);
        }
    }
    for (int i = 0;i < T;i++) sort(a[i].begin(),a[i].end());
    /*  第1次sort之后,各行的vector如下:
        a[0]:3
        a[1]:1
        a[2]:1 2
        a[3]:1 2 3
    */
    sort(a,a + T);
    /*  第2次sort之后,各行的vector如下:
        1
        1 2
        1 2 3
        3
    */
    
    vector<int>::iterator it;
    for (int i = 0;i < T;i++)
    {
        for (it = a[i].begin();it != a[i].end();it++)
        {
            cout << *it << " ";
        }
        cout << endl;
    }
    return 0;
}
例2 约瑟夫问题(原题链接)

题目描述

约瑟夫问题来源于公元1世纪的犹太历史学家Josephus。问题描述,有n个人(分别以编号1,2,3…n表示)围成一个圆圈,从编号为1的人开始进行1~m正向报数,报到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;如此重复下去,直到所有的人全部出列,求最后一个出列人的编号

输入

输入文件仅有一行包含二个用空格隔开的整数N,M (2≤N≤100000,M≤10^9)

输出

输出文件仅有一行包含一个整数表示一个整数,表示最后一个人在队列中的编号。

样例输入

8 3

样例输出

7

AC代码:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int n,m; cin >> n >> m;
    vector<int> v;
    for (int i = 1;i <= n;i++) v.push_back(i);//初始化编号
    int c = -1;//第3个数的下标位2
    while (v.size() != 1)
    {
        c = (c + m) % v.size();//得到要删除的数字的位置(取模使c不超过vector的长度)
        v.erase(v.begin() + c);//将其删除
        c--;//对应一开始的c = -1
    }
    cout << v[0] << endl;//最后只剩一个元素
    return 0;
}
容器中的迭代器

迭代器的功能有强弱之分,一般分为输入输出迭代器、正向迭代器、双向迭代器和随机访问迭代器。

  • 正向迭代器
    ① 如果it是一个正向迭代器,it支持的操作有it++++it*it
    ② 两个正向迭代器可以相互赋值、相互比较:==!=

  • 双向迭代器
    ① 双向迭代器拥有正向迭代器的所有功能
    ② 双向迭代器还支持it----it

  • 随机访问迭代器
    ① 随机访问迭代器拥有双向迭代器的所有功能
    ② 随机访问迭代器还支持it = it + iit = it - i
    ③ 两个随机访问迭代器还可以做运算符比较:<、>、<=、>= (it1 < it2的意思是:it1经过若干次++操作可以等于it2)

  • 需要注意的是,并不是所有的容器都支持迭代器操作,比如stackqueuepriority_queue。原因是栈需要满足先进后出(后进先出),队列需要满足先进先出,所以无法使用迭代器进行访问。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值