《算法竞赛入门经典(第2版)》第五章知识点总结

5-2Ducci序列
1、整型数组转成string:

void change(int *aa,int mm)
{
    stringstream pp;
    for(int i=0;i<mm;i++)
    {
        pp<<aa[i];
        ssss=pp.str();
    }
}

流转化,如果aa包含元素有:8,11,2,7那么ssss的变化过程为:
8,811,8112,81127,是一个累积的过程。
转换成string型后放进集合:

a.insert(ssss);

2、string是可以和char[maxn]比较的

char sss[maxn];
string ssss;
for(int i=0;i<mm;i++)
        {
            sss[i]='0';
        }
if(ssss==sss) {cout<<"ZERO"<<endl;break;}

3、在set中找匹配的元素

 if(find(a.begin(),a.end(),ssss)==a.end()) {a.insert(ssss);}
 else {cout<<"LOOP"<<endl;break;}

else的那一部分表示找到了

4、整型数组拷贝

 memcpy(s,ss,sizeof(ss));

整型数组s和ss的大小相同,将ss的内容拷贝到了s上面,在cstring头文件里

5-3卡片游戏
1、队列的清理用的aa.clear();这个清理删掉了所有元素没有释放内存。
2、队列的几种操作,pop()出队,push()进队,front()队首元素。
3、迭代器的使用,vector遍历经常使用迭代器。

5-4交换学生
1、在集合中查找特定元素:要声明库algorithm

if(find(ss.begin(),ss.end(),s)==ss.end()) {n1++;}
else {ss.insert(s);n2++;}    

这是在集合中找和string型的s匹配的元素,如果找到执行else,没有执行if。

2、整型数组转换为字符串(流转换)

stringstream pp;
            for(int j=0;j<=1;j++)
            {
                pp<<a[j];
                s=pp.str();
            }

注意要声明库sstream,不然会格式错误。

5-5复合词
1、输入可能造成的超时:

while(cin>>s) ss.insert(s);

这是我现在用的输入,之前用的输入是

while(getline(can,s)) ss.insert(s);

2、最主要的超时问题:find函数查找集合中元素的问题:

if(ss.count(s2)&&ss.count(s3)) {cout<<s1<<endl;break;}

这是现在我用的,之前用的是:

f(find(ss.begin(),ss.end(),s2)!=ss.end()&&find(ss.begin(),ss.end(),s3)!=ss.end()) {cout<<s1<<endl;break;}

find函数能用count代替的尽量代替

3、学到的substr()函数:

s2=s1.substr(0,i);

表示从0的位置截取出i个元素放入新的串里。

s3=s1.substr(i);

表示从i的位置截取到串的末尾放入新的串里。

4、注意:set不可以排序,内部就是默认的字典序

5-6对称轴
1、multimap的使用:
首先设置迭代器

 multimap<int,int>::iterator m;

然后对特定元素个数进行统计:

int b=int(f.count(*it));

这里的*it是集合中的元素,需要统计出这一元素对应的个数作为循环条件使用。
然后对特定元素进行查找

m=f.find(*it);

最后提取出该元素对应的second量,即横坐标

for(int k=0;k!=b;k++,m++)
{int bb=m->second;all=all+bb;}

具体细节可以参考:
https://zhidao.baidu.com/question/918049459459983899.html
以及:
https://blog.youkuaiyun.com/xy_cpp/article/details/80426852?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3
这些是multimap用法比较好的参考资料

5-7打印队列
1、vector中的最大值的提取

int maxn=*max_element(s.begin(),s.end());

2、vector的begin()是一个迭代器,vector的第一个元素可以用s[0]或者s.front()进行提取
3、使用对称操作来应对具有特殊标记的问题
4、利用count函数代替find减少时间

if(count(ss.begin(),ss.end(),-1)==0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值