PAT 乙级 1003

题目

题目地址:PAT 乙级 1003

题解

规律观察题,本题的关键在于把题读懂,同时还有几个比较容易疏忽的地方需要注意;总之这道题要考虑的东西更多,细节上也要特别注意;

规律:“如果 aPbTc 是正确的,那么 aPbATca 也是正确的”,这是理解本题的关键信息,观察之后会发现,当b的字符串里再增加一个A,那么T之后的字符串就会多出a个A(特别注意,这里的 ‘ca’ 实际上是 c + a 个A字符的关系),那么这个关系也就显而易见了,只有在 a * b = c 的条件下,才会有这样的结果,我们再来简单推导一下:

设  a * b = c

由题设条件可知:a * (b + 1) = c + a,再次说明,ca表明有c + a个A

将上式分配可得:a * b + a = c + a…………(1)

又  a * b = c

则 (1) 式成立

通过以上分析可知,本题的字符中的关系就是:a * b = c

在分析完本题最重要的条件之后,还需要在代码过程中注意几点问题;需要说明的是,题目条件中三个条件是层层递进的关系,也就是说只有满足之前的条件才能判断之后的条件

从以上先决条件推导可得如下两个需要注意的问题:

1. 字符 P 和 T 在一个字符串中只能出现一次;

2. P 和 T 之间必须有字符 A;

因为没有完全理解之前那句话,结果导致没有一次AC(-_-||)

代码

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4
 5 int main() {
 6     string str;
 7     int n = 0;
 8     int cnta = 0, cntb = 0, cntc = 0;
 9     bool flagp = false, flagt = false, flaga = false, flagx = false;
10     cin >> n;
11     for (int i = 0; i < n; i++) {
12         cin >> str;
13         for (int j = 0; j < str.size(); j++) {
14             switch (str[j]) {
15                 case ‘A‘:
16                     flaga = true;
17                     if (!flagp && !flagt) cnta++;
18                     else if (flagp && !flagt) cntb++;
19                     else if (flagp && flagt) cntc ++;
20                     break;
21                 case ‘P‘:
22                     if (flagp)
23                         flagx = true;
24                     else
25                         flagp = true;
26                     break;
27                 case ‘T‘:
28                     if (flagt)
29                         flagx = true;
30                     else
31                         flagt = true;
32                     break;
33                 default:
34                     flagx = true;
35                     break;
36             }
37             if (flagx) break;
38         }
39         if (flagx)
40             cout << "NO" << endl;
41         else if (flagp && flagt && flaga && cntb != 0 && cnta * cntb == cntc)
42             cout << "YES" << endl;
43         else
44             cout << "NO" << endl;
45         cnta = cntb = cntc = 0;
46         flagp = flagt = flaga = flagx = false;
47     }
48
49     return 0;
50 }

原文地址:https://www.cnblogs.com/moujun1001/p/9966189.html

时间: 2024-09-27 23:46:56

PAT 乙级 1003的相关文章

C++&#183;PAT乙级1003. 我要通过!(17/20)

/* 1003. 我要通过!(20) "答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于PAT的"答案正确"大派送 -- 只要读入的字符串满足下列条件,系统就输出"答案正确",否则输出"答案错误". 得到"答案正确"的条件是: 1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符: 2. 任意形如 xPATx 的字符串都可以获得"答案正确",其中 x 或者是空字符串

PAT乙级.1003.我要通过

"答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于PAT的"答案正确"大派送 -- 只要读入的字符串满足下列条件,系统就输出"答案正确",否则输出"答案错误". 得到"答案正确"的条件是: 1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符: 2. 任意形如 xPATx 的字符串都可以获得"答案正确",其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串:

PAT乙级 1003. 我要通过!

题目: "答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于PAT的"答案正确"大派送 -- 只要读入的字符串满足下列条件,系统就输出"答案正确",否则输出"答案错误". 得到"答案正确"的条件是: 1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符: 2. 任意形如 xPATx 的字符串都可以获得"答案正确",其中 x 或者是空字符串,或者是仅由字母 A 组成的字

PAT乙级1003

19分,有点没懂题目意思,隔段时间再回来看看. import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); scanner.nextLine(); for(int i = 0 ; i < n ; ++i){ String str = scanner.

1054. 求平均值 (20)-PAT乙级真题

今天刚刚到学校,2017年学习正式开始了,今天看到了浙大的<数据结构>这学期又要开课了,决定一定要跟着学习一遍:在大学生mooc网上学习:http://www.icourse163.org/course/zju-93001#/info :然后就是跟着<算法之美>也要同步看完. 然后就在PAT上随便做一道题,这是第一次通过AC,发现了两个比较好的博客主页:http://www.liuchuo.net/  和  https://www.joyhwong.com/   都总结了刷题的过程

PAT乙级1034. 有理数四则运算(20)

本题要求编写程序,计算2个有理数的和.差.积.商. 输入格式: 输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0. 输出格式: 分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和.差.积.商.注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分:若为负数,则须加括号:若除法分母为0,则输出“Inf”.题目保证正确的输出中没

PAT乙级1006题python3代码

PAT乙级1006题python3代码 目录 PAT乙级1006题python3代码 目录 代码 题目: 让我们用字母B来表示"百".字母S表示"十",用"12-n"来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数.例如234应该被输出为BBSSS1234,因为它有2个"百".3个"十".以及个位的4. 输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000). 输出

PAT 乙级 1045

题目 题目地址:PAT 乙级 1045 题解 本题的解法比较巧妙,刚开始的试着用暴力求解,果不其然时间超限-- 变换思路,既然对于每个元素来说满足的条件是前小后大,那么对数组排序,对应的位置相等的即为题设要求的"可能主元",但是还有一个条件要保证当前是从左向右遍历的最大值:总结一下两个条件:1. 排序后对应位置数字相等:2. 当前操作元素是从左向右遍历中的最大值 同时还要注意,当输入n值为0时,除了需要输出"可能主元"的个数之外,还需要保留换行符'\n' 代码 1

PAT 乙级 1017

题目 题目地址:PAT 乙级 1017 题解 粗看是一道大数除法题,实际上只不过是通过字符数组模拟除法过程,理解之后还是比较简单的: 具体分析一下本题: 因为题设中的除数(n)是一位整数,因此大幅简化了整个运算过程:在整个运算中最为重要的就是中间变量(sum),判断中间变量sum是否足够大能被除数n整除,这也是本题的关键所在: 通过是否判断sum是否能被整除,可以分为以下两种情况: 1. sum == 0 && num[i] < n (当前运算位num[i]小于除数) 2. 其余情况