1003 我要通过! (20 分)

题目来源

“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

  1. 字符串中必须仅有 PAT这三种字符,不可以包含其它字符;
  2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
  3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

输入格式:

每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n < 10,是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。

输出格式:

每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES,否则输出 NO

输入样例:

  1. 8
  2. PAT
  3. PAAT
  4. AAPATAA
  5. AAPAATAAAA
  6. xPATx
  7. PT
  8. Whatever
  9. APAAATAA

输出样例:

  1. YES
  2. YES
  3. YES
  4. YES
  5. NO
  6. NO
  7. NO
  8. NO

分析:

  • 只能有一个P一个T
  • 对于 xPATx,PAT, AAPATAA都是YES,只要两端的 A 的个数相同
  • 对于aPbTc和aPbATca,

    • PAT是正确的,那么PAAT也是正确的
    • AAPATAA是正确的,那么AAPAATAAAA也是正确的
  • 总结:只能有一个P和T,前面A的个数 * 中间A的个数 = 后面A的个数
  • 可以用三个变量,front,mid,rear将每个部分的A的个数记录下来,最后判断front * mid是否等于rear
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. bool pass(string str)
  6. {
  7. if (str == "PAT")
  8. {
  9. return true;
  10. }
  11.  
  12. int index, front, mid, rear;
  13. index = front = mid = rear = ;
  14.  
  15. while (str[index] == 'A')
  16. {
  17. index++;
  18. front++; //记录前面A的个数
  19. }
  20. if (str[index] == 'P')
  21. {
  22. index++;
  23. }
  24. else
  25. {
  26. return false;
  27. }
  28.  
  29. while (str[index] == 'A')
  30. {
  31. mid++; //记录中间A的个数
  32. index++;
  33. }
  34.  
  35. if (str[index] == 'T')
  36. {
  37. index++;
  38. }
  39. else
  40. {
  41. return false;
  42. }
  43.  
  44. while (str[index] == 'A')
  45. {
  46. rear++; //记录后面A的个数
  47. index++;
  48. }
  49.  
  50. if (!str[index] && rear == mid * front && mid > )
  51. {
  52. return true;
  53. }
  54.  
  55. return false;
  56. }
  57.  
  58. int main()
  59. {
  60. int n;
  61. string str;
  62. cin >> n;
  63.  
  64. for (int i = ; i < n; ++i)
  65. {
  66. cin >> str;
  67. bool flag = pass(str);
  68. if (flag)
  69. {
  70. cout << "YES" << endl;
  71. }
  72. else
  73. {
  74. cout << "NO" << endl;
  75. }
  76. }
  77.  
  78. return ;
  79. }

map解法:

首先了解下 map 是什么, map  是 C++ 的STL容器,内部实现是红黑树(一种非严格意义的平衡二叉树,具有排序功能), map 提供一对一的关系

map<K, T> 类模板定义在头文件 map 中,它定义了一个保存 T 类型对象的 map, 每个 T 类对象都有一个关联的K类型的键 

map的特性:

  • 所有的元素会根据元素的键值(key)自动排序
  • map所有元素都是pair,同时拥有key(键值)和value(实值)
  • pair的第一个元素视为键值key,第二个元素视为实值value
  • map不允许两个元素拥有相同的键值

map的基本构造函数

  1. map<int ,string >intMap;
  2.  
  3. map<string , int >strMap;
  4.  
  5. map< char ,string>charMap;
  6.  
  7. map<sring, char>strMap;
  8.  
  9. map<char ,int>charMap;
  10.  
  11. map<int ,char >intMap

map的基本操作函数

  1. begin() 返回指向map头部的迭代器
  2.  
  3. clear() 删除所有元素
  4.  
  5. count() 返回指定元素出现的次数
  6.  
  7. empty() 如果map为空则返回true
  8.  
  9. end() 返回指向map末尾的迭代器
  10.  
  11. equal_range() 返回特殊条目的迭代器对
  12.  
  13. erase() 删除一个元素
  14.  
  15. find() 查找一个元素
  16.  
  17. get_allocator() 返回map的配置器
  18.  
  19. insert() 插入元素
  20.  
  21. key_comp() 返回比较元素key的函数
  22.  
  23. lower_bound() 返回键值>=给定元素的第一个位置
  24.  
  25. max_size() 返回可以容纳的最大元素个数
  26.  
  27. rbegin() 返回一个指向map尾部的逆向迭代器
  28.  
  29. rend() 返回一个指向map头部的逆向迭代器
  30.  
  31. size() 返回map中元素的个数
  32.  
  33. swap() 交换两个map
  34.  
  35. upper_bound() 返回键值>给定元素的第一个位置
  36.  
  37. value_comp() 返回比较元素value的函数

思路:

将 P, A, T 三个字符作为键值存入map,对应的value是它们出现的次数,最后还要判断 map.size()是否等于3

  1. #include <iostream>
  2. #include <string>
  3. #include <map>
  4. using namespace std;
  5.  
  6. bool pass(string str)
  7. {
  8. map<char, int> charMap;
  9. int length = str.size();
  10. int posOfP = , posOfT = ;
  11. for (int i = ; i < length; ++i)
  12. {
  13. charMap[str[i]]++;
  14. if (str[i] == 'P')
  15. {
  16. posOfP = i; //这时候的i为P前面 A 的个数(执行完循环体的步骤才会执行++i)也可以理解为P的位置
  17. }
  18. if (str[i] == 'T')
  19. {
  20. posOfT = i; //i为T的位置
  21. }
  22. }
  23. if (charMap['P'] == && charMap['T'] == && charMap['A'] != && charMap.size() == && posOfT - posOfP != && posOfP*(posOfT - posOfP - ) == str.size() - posOfT - )
  24. {
  25. return true;
  26. }
  27. else
  28. {
  29. return false;
  30. }
  31. }
  32.  
  33. int main()
  34. {
  35. int n;
  36. string str;
  37. cin >> n;
  38.  
  39. for (int i = ; i < n; ++i)
  40. {
  41. cin >> str;
  42. bool flag = pass(str);
  43. if (flag)
  44. {
  45. cout << "YES" << endl;
  46. }
  47. else
  48. {
  49. cout << "NO" << endl;
  50. }
  51. }
  52. return ;
  53. }

23行代码:

  1. if (charMap['P'] == && charMap['T'] == && charMap['A'] != && charMap.size() == && posOfT - posOfP != && posOfP*(posOfT - posOfP - ) == str.size() - posOfT - )
  1. charMap['P'] == && charMap['T'] == && charMap['A'] != && charMap.size() == 3
  2.  
  3. 为了防止出现`PT` PT个数大于1的情况
    charMap.size() == 3 是为了防止出现除 PAT 之外的字母
  1. posOfT - posOfP != 1 && posOfP*(posOfT - posOfP - 1) == str.size() - posOfT - 1)
  1. 1.假设给定字符串是AAPATAA,那么posOfT = 4 posOfP = 2 posOfT - posOfP = 2,所以,中间A的个数 = posOfT - posOfP - 1
    2.假设给定字符串是PT,那么 posOfT - posOfP = 1,所以posOfT - posOfP != 1是用来排除PT这种中间没有A的情况的
    3.假设给定字符串是AAPATAA,那么str.size() = 7, posOfT = 4, str.size() - posOfT - 1 = 后面A的个数

满足上述条件就返回 true

PAT 乙级 1003.我要通过! C++/Java的更多相关文章

  1. PAT 乙级 1003

    题目 题目地址:PAT 乙级 1003 题解 规律观察题,本题的关键在于把题读懂,同时还有几个比较容易疏忽的地方需要注意:总之这道题要考虑的东西更多,细节上也要特别注意: 规律:“如果 aPbTc 是 ...

  2. PAT乙级--1003

    1003. 我要通过!(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue "答案正确"是 ...

  3. PAT乙级1003

    1003 我要通过! (20 point(s)) “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”, ...

  4. [C++]PAT乙级1003. 我要通过!(17/20)

    /* 1003. 我要通过!(20) “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错 ...

  5. PAT 乙级 1003 我要通过!(20) C++版

    1003. 我要通过!(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue “答案正确”是自动判题系统给出的最 ...

  6. PAT 乙级 1032.挖掘机技术哪家强 C++/Java

    题目来源 为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第 1 行给出不超过 1 的正整数 N,即参赛人数.随后 ...

  7. PAT乙级 1003. 我要通过!(20)

    答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”. 得到“答案正确”的条件是: 1. ...

  8. PAT 乙级1003. 我要通过!(20)

    “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”. 得到“答案正确”的条件是: 1 ...

  9. PAT 乙级 1091.N-自守数 C++/Java

    题目来源 如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为“N-自守数”.例如 3,而 2 的末尾两位正好是 9,所以 9 是一个 3-自守数. 本题就请你编写程序判断 ...

随机推荐

  1. C/C++ 交换两个数,不使用第三个变量, 函数模板来实现

    #include <iostream> template<typename T> void exchangeTwoNumber(T &t1, T &t2): v ...

  2. ping-pong buffer

    1 什么是pingpong? pingpong是一种数据缓存的手段,通过pingpong操作可以提高数据传输的效率. 2 什么时候需要pingpong? 在两个模块间交换数据时,上一级处理的结果不能马 ...

  3. 安装-supervisor

    centos 7.xx 1.#yum install python-setuptools 2.#easy_install supervisor 3.# vim /etc/supervisord.con ...

  4. Django RestFramework中UpdateAPIView类使用

    修改数据 from django.conf.urls import url from .api import workflow,workflowline urlpatterns = [ url(r'^ ...

  5. odoo 币别符号显示机制 Monetary

    //-------------------------------------------------------------------basic_fields.js init: function ...

  6. Python 3 + Selenium 3 简单入门学习示例 126邮箱登录

    这是一个很多基础演示的书上的例子,但是一般按照这些书上的代码可能都不能成功登录.也许是网易修改了126的页面导致的吧,下面给出最新的能够work的版本 from selenium import web ...

  7. [SOJ #687]双生串(2019-11-6考试)/[hdu5431]AB String

    题目大意 把所有仅包含\(AB\)的字符串按字典序排列,给你一个仅包含\(AB\)的字符串\(S\),然后有\(Q\)个问题,第\(i\)个问题给你\(k_i\),求不是\(S\)的子串中,第\(k_ ...

  8. Java的常用API之Object类简介

    Object类 1.toString方法在我们直接使用输出语句输出对象的时候,其实通过该对象调用了其toString()方法. 2.equals方法方法摘要:类默认继承了Object类,所以可以使用O ...

  9. 使用docker部署titpetric/netdata

    netdata 是常用的Linux系统性能实时监控面板 官方docker netdata/netdata部署 docker run -d --name=netdata \ -p 19999:19999 ...

  10. ASP.NET Core 2.0升级到3.0的变化和问题

    前言 在.NET Core 2.0发布的时候,博主也趁热使用ASP.NET Core 2.0写了一个独立的博客网站,现如今恰逢.NET Core 3.0发布之际,于是将该网站进行了升级. 下面就记录升 ...