各大算法专题-STL篇

这篇文章着重记录c++中STL的用法。主要粗略的介绍其用法,以知识点的形式呈现其功能,不会深入源码分析其工作原理。

排序和检索.

sort(a,a+n),对a[0]往后的n个元素(包括a[0])进行排序,默认的这种形式由小到大的排序.其属于<algorithm>这个头文件中,它可以给任何对象进行排序,但是需要写自定义函数cmp.完整形式为sort(a,a+n,cmp).

low_bound(a , a+n ,x)-a得到数组a[]从a[0]往后n个长度中,第一个大于或者等于x的下标index.这里的下标,是指数组a[0],a[1],a[2],…,a[n-1]中的下标。

Q1(uva 10474):

现在有N个大理石每颗石头上写了一个非负整数。首先把各数从小到大排序,然后进行Q次质询,每次质询给出一个负整数,需要你找到这个整数在第几颗石头上(排序后)。

具体代码:

 #include<cstdio>
#include<algorithm>

using namespace std;
const int maxn = 10000;

int main()
{
    int n , q , a[maxn] , kase = 1;
    while(scanf("%d%d",&n , &q) != EOF)
    {
         if(n == 0)  break;
          printf("CASE# %d:\n",kase++);
         for(int i = 0;i < n;i++)
              scanf("%d",&a[i]);

         sort(a , a + n);
         while(q--)
         {

            int x;
            scanf("%d",&x);
            int index;
            index = lower_bound(a , a + n , x) - a;
            if(a[index] == x)  printf("%d found at %d\n",x , index + 1);
            else               printf("%d not found\n",x);
         }
    }
}

集合set:集合是stl中一个容器,它储存字符串的时候。默认按照字典序排列。

stringstream(str):这个对象的用法,是以流的方式,将一个字符串s(形如s1 s2 s3)分别表示成三个子串s1,s2,s3的形式。

Q2:给出一个文本,找出所有不同的单词(连续的字母序列),按字典序从小到大输出,单词不区分大小写。

分析:这个问题就是为了简单的呈现set和stringstream的用法。首先我们利用特殊的输入技巧,将文本的被空格分隔的连续串拿下来,然后基于stringstream的用法再将某个连续串中非字母的成分变为空格,再把真正的连续字母序列拿到,将其存在容器set里面,由于set容器对字符串默认为由小到大的字典序排列,我们只需要再将容器中的内容顺序输出即可。

参考代码如下:

 #include<cstdio>
#include<iostream>
#include<string>
#include<set>
#include<sstream>
using namespace std;
set<string> dict;

int main()
{
     string s , buf;
     while(cin>>s)
     {
          for(int i = 0;i < s.length();i++)
             if(isalpha(s[i]))  s[i] = tolower(s[i]);
             else               s[i] = ‘ ‘;

            stringstream ss(s);
            while(ss >>  buf)  dict.insert(buf);
     }

     for(set<string>::iterator it = dict.begin();it != dict.end();++it)

           cout <<*it<<"\n";

     return 0;
}

映射map:

map能够建立两个数组元素之间的一一对应关系,例如我们建立星期几的英文单词和数字1~7的映射关系,就可以定义map<string , int> a,  a[“Monday”] = 1.

Q3(uva 156):

给出一个文本,找到文本中的一类单词,这一类单词满足该文本中其余任何单词,通过重组字母序列,都无法得到这个单词,找到所有这类的单词之后,按照字典序输出。

分析:这个看似和字符串有关的复杂模拟题目,和诸多stl中的用法结合起来,就会显得一场简洁.

考虑如何满足那条性质,假设我们用一个vector<string> s来储存原始的文本,遍历每个单词,我们将得到的单词按照字母大小顺序进行重排,得到新的序列r,将其放入映射中,我们领用map<string , int> cnt记录重排后的序列r出现的次数,遍历完文本单词之后,我们再遍历储存原始文本的向量s,如果当前的单词s[i],其重排之后的序列r,满足cnt[r] = 1,说明这个字符串是满足要求的字符串,将其放入一个新的字符串向量ans中,枚举完成后,将ans按照字典序排序,然后顺序输出即可。

参考代码如下:

#include<cstdio>
#include<iostream>
//#include<cctype>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
map<string , int> cnt;
vector<string> words;

string repr(const string &s)
{
      string ans = s;
      for(int i = 0;i < ans.length();i++)
          ans[i] = tolower(ans[i]);

      sort(ans.begin() , ans.end());

      return ans;
}

int main()
{
      int n = 0;
      string s;
      while(cin >> s)
      {
            if(s[0] == ‘#‘) break;
             words.push_back(s);
             string r = repr(s);

             if(!cnt.count(r))  cnt[r] = 0;
             cnt[r]++;
      }

      vector<string> ans;
      for(int i = 0;i < words.size();i++)
          if(cnt[repr(words[i])] == 1)   ans.push_back(words[i]);
      sort(ans.begin() , ans.end());

      for(int i = 0;i < ans.size();i++)
        cout<<ans[i]<<"\n";
}
时间: 2024-11-07 01:23:18

各大算法专题-STL篇的相关文章

各大算法专题-组合数学篇

Q1(uva 1635): 给出长度为n(范围在[1,100000])的序列(仅仅知道长度n,具体某个元素我们并不清楚),类似差分序列的形成方法,我们这里得到这样的一个序列: 参考代码如下: #include<cstdio> #include<vector> #include<cmath> #include<cstring> using namespace std; const int maxn1 = 1000+ 5; const int maxn2 = 1

统治世界的十大算法

转自 http://geek.csdn.net/news/detail/32456 软件正在统治世界.而软件的核心则是算法.算法千千万万,又有哪些算法属于“皇冠上的珍珠”呢?Marcos Otero给出了他的看法. 什么是算法? 通俗而言,算法是一个定义明确的计算过程,可以一些值或一组值作为输入并产生一些值或一组值作为输出.因此算法就是将输入转为输出的一系列计算步骤. —Thomas H. Cormen,Chales E. Leiserson,算法入门第三版 简而言之,算法就是可完成特定任务的一

[算法专题] LinkedList

前段时间在看一本01年出的旧书<effective Tcp/Ip programming>,这个算法专题中断了几天,现在继续写下去. Introduction 对于单向链表(singly linked list),每个节点有?个next指针指向后一个节点,还有一个成员变量用以储存数值:对于双向链表(Doubly LinkedList),还有一个prev指针指向前一个节点.与数组类似,搜索链表需要O(n)的时间复杂度,但是链表不能通过常数时间读取第k个数据.链表的优势在于能够以较?的效率在任意位

数据挖掘十大算法

大数据时代 数据挖掘十大经典算法 不不过选中的十大算法,事实上參加评选的18种算法.实际上随便拿出一种来都能够称得上是经典算法,它们在数据挖掘领域都产生了极为深远的影响. 1.C4.5 C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3算法.C4.5算法继承了ID3算法的长处.并在下面几方面对ID3算法进行了改进: 1)用信息增益率来选择属性.克服了用信息增益选择属性时偏向选择取值多的属性的不足: 2)在树构造过程中进行剪枝: 3)可以完毕对连续属性的离散化处理. 4)可以对不

数据挖掘十大算法之决策树详解(2)

在2006年12月召开的 IEEE 数据挖掘国际会议上(ICDM, International Conference on Data Mining),与会的各位专家选出了当时的十大数据挖掘算法( top 10 data mining algorithms ),可以参见文献[1].本博客已经介绍过的位列十大算法之中的算法包括: [1] k-means算法(http://blog.csdn.net/baimafujinji/article/details/50570824) [2] 支持向量机SVM

【枚举算法Day1】20170529-2枚举算法专题练习

20170529-2枚举算法专题练习 青岛二中日期 序号 题目名称 输入文件名 输出文件名 时限 内存 算法 难度 分类 081113 1 最大矩形 rectangle.in rectangle.out 1s 256MB 枚举 1 02枚举 081031 2 回文 palin.in palin.out 1s 256MB 枚举.优化 1 02枚举 081008 3 问题的设置 problemsetter.in problemsetter.out 1s 256MB 排序+枚举 1 02枚举 0810

王家林每日大数据语录Spark篇

王家林每日大数据语录Spark篇0043(2015.12.15于上海):Worker在退出的时候会通过ExecutorRunner杀死Executor并且会将运行在当前Worker下的Driver Client删除掉,最终AppClient端的SparkDeploySchedulerBackend会收到Master发过来的StatusUpdate信息来处理Executor丢失的信息,Task会被重新分配. 王家林每日大数据语录Spark篇0042(2015.12.15于上海):生产环境下Spar

[转载]系统运维秘诀大分享专题

系统运维秘诀大分享专题 本专题整合收录了有关系统运维/系统管理员工作和个人成长方面的各种心得分享.经验总结.以及必须牢记的一些准则,适合所有在运维领域有追求的技术人阅读.有些分享的层次比较深,有些则是运维的基础课,但通过翻看他人的心得,相信你总能有所收获. 1 Dormando的系统运维秘诀三部曲... 4 1.1 技术篇... 4 1.1.1 为变化而设计.... 4 1.1.2 使用自动的,可重复的构建过程.... 4 1.1.3 使用冗余.... 4 1.1.4 使用备份.... 5 1.

机器学习九大算法---回归

机器学习九大算法---回归 转自:http://blog.csdn.net/xiaohai1232/article/details/59551240 回归分析即,量化因变量受自变量影响的大小,建立线性回归方程或者非线性回归方程,从而达对因变量的预测,或者对因变量的解释作用. 回归分析流程如下: ①探索性分析,画不同变量之间的散点图,进行相关性检验等,了解数据的大致情况,以及得知重点关注那几个变量: ②变量和模型选择,: ③回归分析假设条件验证: ④共线性和强影响点检查: ⑤模型修改,并且重复③④