紫书——STL初步例题思路总结

UVa 10474

题意:给上面写有非负整数的大理石排序并查找指定的大理石位置

思路:扫入数组,用sort排序,查找(可以用“返回大于或等于x的第一个位置”的lower_bound函数)即可

UVa  101

题意:

输入n,得到编号为0~n-1的木块,分别摆放在顺序排列编号为0~n-1的位置。现对这些木块进行操作,操作分为四种。

1、move a onto b:把木块a、b上的木块放回各自的原位,再把a放到b上;

2、move a over b:把a上的木块放回各自的原位,再把a发到含b的堆上;

3、pile a onto b:把b上的木块放回各自的原位,再把a连同a上的木块移到b上;

4、pile a over b:把a连同a上木块移到含b的堆上。

当输入quit时,结束操作并输出0~n-1的位置上的木块情况

思路:

0.我们首先发现所有操作其实就是移回原来的位置,移动到新的位置,当然移动哪一个木块我们需要有个查找它在哪的过程(查找位置)。

1.再具体看四种操作,含onto的,都需要将b上方的归位,含move的都需要将a上方的归位,并且所有的都需要在归位后,将a及a以上的移动到b顶。

2.读入数据,进行初始化(把编号为i的木块放到i号位置),模拟操作,输出即可。

关于vector数组的使用几点说明:

vector<int> a[maxn] (每一个a[maxn]都是vector数组)

push_back(),pop_back()可以自动改变大小

需要只保留0~h的元素:resize(h+1)

UVa 10815

题意:找出一段文本里,不同的单词,按字典序输出

思路:

首先明白set的功能:每个元素最多只能出现一次(它还会自动排序),因此只要变成小写存入set即可

关于set的使用几点说明:

声明:set<string> dic;

插入元素:dic.insert(s)

补充迭代器:

迭代器(iterator),类似于指针的用法,下面是一个遍历的示例

set<string> dic;
for(set<string>::iterator it = dic.begin(); it != dic.end(); it++)
    cout << *it <<endl;

UVa 156

题意:输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本的另外一个单词。在判断是否满足条件时,字母不分大小写,但在输出时应保留输入中的大小写,按字典序进行排序。

思路:

进行“标准化”,将输入的每个单词都转化成小写再进行排序,然后再放入map进行统计。

开一个vector数组储存出现的单词原型,开一个map储存“标准化”后的单词及其出现的次数

显然对于每个出现一次的单词就是我们想要的东西,不过输出是需要字典序的,再开一个vector存一下排序即可。

关于map的find()和count():

count():有返回的1,没有返回的0

find():有返回位置,没有返回end()

UVa 12096

题意:

一个栈计算机,输入的命令有如下几种:

PUSH:将空集{}压栈

DUP:将栈顶元素复制一份压入栈中

UNION:先进行两次弹栈,将获得的集合A和B取并集,将结果压栈

INTERSECTION:先进行两次弹栈,将获得的集合A和B取交集,将结果压栈

ADD:先进行两次弹栈,将获得的集合A和B中,先出栈的集合(如A先)加入到后出栈的集合,将结果压栈

输出每一步操作后栈顶集合的元素的个数。

思路:

开一个map:把集合映射成ID

开一个vector:根据ID去取集合

一个ID函数:查一下某个集合x的ID,如果查不到,就给它分配一个ID

开一个栈,模拟题目的操作

关于set的一些操作:

取并集:set_union(x1.begin(),x1.end(),x2.begin(),x2.end(),inserter(x,x.begin()))

依次传入两个集合的起始位置和结束位置,然后一个inserter迭代器,下作解释。

inserter(container,pos):在内部调用insert()成员函数,将元素插入第二个参数所指的位置。

set_intersection同理,不过是取交集操作。

UVa 540

题意:

t个团队排队,新来一个人,有队友排队,就插到最后一个队友后面,如果没有,就站到长队的队尾。输入队伍中所有队员的编号,要求支持以下三种指令:

ENQUEUE x:编号为x的人进队

DEQUEUE:长队队首出队

STOP:停止模拟

对于每个DEQUEUE指令,输出出队的人的编号。

思路:

显然,相同队伍的人会站在一起,开两个队列,一个存的是队伍编号(即大队伍),一个存的是每个小队伍里成员的站位(利用数组),再用一个map映射一下每个成员的所属队伍。

对于每个进来的人,先查他是哪个队的,再查他的队伍有没有人。

对于每个出去的人,先查队首是哪个队,让第一个人出去,再看看这个队出去一个人是不是空的,如果空了,让这个队出去。

UVa 136

题意:输出第1500个丑数

丑数:不能被2,3,5以外的素数整除的数(1也是丑数)

思路:对于任意丑数x,我们有2x,3x,5x都是丑数。利用优先队列取出最小的丑数,生成三个丑数(需要利用集合判重)。

代码实现:

const int coeff[3]={2,3,5};
int ugly()
{
    priority_queue<long long int, vector<long long int>,greater<long long int> >pq;
    set<long long int> s;
    pq.push(1);
    s.insert(1);
    for(int i=1;i<n; i++)
    {
        long long int x=pq.top();
        pq.pop();
        for(int j=0; j<3; j++)
        {
            long long int x2=x*coeff[j];
            if(!s.count(x2))
            {
                s.insert(x2);
                pq.push(x2);
            }
        }
    }
}

关于优先队列的一点补充:

对于常见的优先队列,STL提供了更为简单的定义方法,例如

“越小的整数优先级越高”——“priority_queue<int, vector<int>,greater<int> > pq”(最后的> >最好有空格)

当然,也是可以定义一个结构体cmp,去重载“()”运算符

例如,“个位数大的整数有限优先级反而小”——“priority_queue<int, vector<int>,cmp > pq”

struct cmp
{
    bool operator()(const int a,const int b)const
    {
        //a的优先级比b小时返回true
        return a % 10 > b % 10;
    }
};

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值