4.7 其它高效技巧与算法

那年仲夏 提交于 2019-11-29 13:25:21

2019年9月PAT - 练习笔记——4.7

以下页码标注的是阅读器中实际页码,而不是书本身自印的页码。

第4章 入门篇(2)——算法初步

4.7 其它高效技巧与算法

注意

  1. 结果数为0时,可能要输出空行,见B1045 / A1101
    1. 题目没说的话,可以通过“格式错误”猜测

目录

  1. B1040 / A1093 有几个PAT
  2. B1045 / A1101 快速排序

  1. B1040 / A1093 有几个PAT

    字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T)。

    现给定字符串,问一共可以形成多少个 PAT

    输入格式:

    输入只有一行,包含一个字符串,长度不超过105,只包含 PAT 三种字母。

    输出格式:

    在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。

    输入样例:

    APPAPT
    

    输出样例:

    2
    
    1. 我的

      #include <iostream>
      #include <string>
      
      using namespace std;
      
      const int MOD = 1000000007; 
      
      int main(void)
      {
          string str = "";
          cin >> str;
          
          int countp = 0, counta = 0, countt = 0;
          for (int i = 0;i < str.size();++i) {
          	if (str[i] == 'P') ++countp;
          	else if (str[i] == 'A') counta = (counta + countp) % MOD;
          	else countt = (countt + counta) % MOD;
      	}
      	cout << countt;
      
          return 0;
      }
      
    2. 《算法笔记》P192


  2. B1045 / A1101 快速排序

    著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的 N 个互不相同的正整数的排列,请问有多少个元素可能是划分前选取的主元?

    例如给定 N=5N = 5, 排列是1、3、2、4、5。则:

    • 1 的左边没有元素,右边的元素都比它大,所以它可能是主元;
    • 尽管 3 的左边元素都比它小,但其右边的 2 比它小,所以它不能是主元;
    • 尽管 2 的右边元素都比它大,但其左边的 3 比它大,所以它不能是主元;
    • 类似原因,4 和 5 都可能是主元。

    因此,有 3 个元素可能是主元。

    输入格式:

    输入在第 1 行中给出一个正整数 N(≤105); 第 2 行是空格分隔的 N 个不同的正整数,每个数不超过 109。

    输出格式:

    在第 1 行中输出有可能是主元的元素个数;在第 2 行中按递增顺序输出这些元素,其间以 1 个空格分隔,行首尾不得有多余空格。

    输入样例:

    5
    1 3 2 4 5
    

    输出样例:

    3
    
    1. 我的

      #include <iostream>
      #include <vector>
      #include <queue>
      
      using namespace std;
      
      int main(void)
      {
      	int n = 0;
      	cin >> n;
      	vector<int> nums(n);
      	vector<int> maxnum(n, 0);
      	cin >> nums[0];
      	maxnum[0] = nums[0];
      	for (int i = 1;i < n;++i) {
      		cin >> nums[i];
      		maxnum[i] = max(maxnum[i - 1], nums[i]);
      	}
      	
      	vector<int> minnum(n, 1e9 + 1);
      	minnum[n - 1] = nums[n - 1];
      	priority_queue<int, vector<int>, greater<int>> output;
      	if (n > 1 && maxnum[n - 2] < nums[n - 1]) output.push(nums[n - 1]);
      	for (int i = n - 2;i > 0;--i) {
      		minnum[i] = min(minnum[i + 1], nums[i]);
      		if (maxnum[i - 1] < nums[i] && minnum[i + 1] > nums[i]) output.push(nums[i]);
      	}
      	if (n > 1 && minnum[1] > nums[0]) output.push(nums[0]);
      
      	cout << output.size() << endl;
      	if (output.size()) {
      		cout << output.top();
      		for (output.pop();!output.empty();output.pop()) cout << " " << output.top();
      	}
      	else
      		cout << endl;
          return 0;
      }
      

      若结果数为0,则要输出一个空行,否则测试点2格式错误

    2. 《算法笔记》P194


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!