【每日一题】PAT(Basic Level) 1003 我要通过! (20分)

题目来源 PAT(Basic Level) 1003,一起学习一起进步🙇‍,如果内容对您有帮助欢迎点赞~~


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

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

  1. 字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
  2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
  3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
    现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入格式:
  • 每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。
输出格式:

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

输入样例:
8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
输出样例:
YES
YES
YES
YES
NO
NO
NO
NO
解题思路
  1. 必须仅包含 P、A、T
  2. xPATx 唯一正确,要注意前后 x 必须一致 ,P 和 T 位置
  3. 第三条规则推导如下

a P b T c 正 确 → a P b A T c a 正 确 aPbTc^{正确} \rightarrow aPbATca^{正确} aPbTcaPbATca

 AAPAATAAAA
 AAPATAA
 yes 【PAT两边 x 一致】
 APAAATAA
 APAATA
 APAT
 no 【PAT两边 x 不一致】

定义 A … … A A……A AA (由n个A连接在一起的串)为$ A^{n} $

则规则三可表示为 A a P A b T A c → A a P A b A T A c + a A^{a}PA^{b}TA^{c} \rightarrow A^{a}PA^{b}ATA^{c+a} AaPAbTAcAaPAbATAc+a

反过来要确定 $A{a}PA{b}TA^{c} $ 是否正确需要确定

A a P A b − 1 T A c − a A^{a}PA^{b-1}TA^{c-a} AaPAb1TAca

A a P A b − 2 T A c − 2 a A^{a}PA^{b-2}TA^{c-2a} AaPAb2TAc2a

A a P A b − 3 T A c − 3 a A^{a}PA^{b-3}TA^{c-3a} AaPAb3TAc3a

⋯ \cdots

A a P A T A c − ( b − 1 ) a A^{a}PATA^{c-(b-1)a} AaPATAc(b1)a

此时必须符合 x P A T x xPATx xPATx 则有

a = c − ( b − 1 ) a ⇒ c = a b a = c - (b-1)a \Rightarrow c = ab a=c(b1)ac=ab

综上所述 只需要统计 P 之前的 A 的数量 a 、P 和 T 中间的 A 的数量 b、T 之后 A 的数量 c,最后判断 c 是否与 ab 乘积相等即可。

完整代码
#include <iostream>
#include <string>

using namespace std;

bool isPAT(string &str) 
{
	int count[3] = { 0,0,0 };
	int pos = 0;
	for (int i = 0; i < str.length(); ++i)
	{
		if(str[i] == 'A')
		{
			++count[pos];
		}
		else if(str[i] == 'P' && pos == 0)
		{
			pos = 1;
		}
		else if(str[i] == 'T' && pos == 1)
		{
			pos = 2;
		}
		else
		{
			return false;
		}
	}
	return pos == 2 && count[1] > 0 && count[2] == count[0] * count[1];
}

int main()
{
	int n = 0;
	cin >> n;
	while (n > 0)
	{
		string str;
		cin >> str;
		if (isPAT(str))
		{
			cout << "YES" << endl;
		}
		else
		{
			cout << "NO" << endl;
		}
		--n;
	}
}

题目来源 PAT(Basic Level) 1003,一起学习一起进步🙇‍,如果内容对您有帮助欢迎点赞~~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BNUEP Offline Judge 北京师范大学珠海校离线评测系统是在具备题目测试数据的情况下,能无联网自动评测ACM/ICPC模式的源代码评测系统(即本地测试工具、评测机)。它主要有以下功能(所有的功能都无需联网,在本机即可实现): *评测核心功能: 基本具备Online Judge的判题核心功能,如编译代码、内存限定,时间限定,获取代码长度等; *支持多种语言: 1.0 Beta2版本支持C/C++、Pascal、C#、JAVA; *出题模式 可以在有标准输入数据和标准程序的情况下,由系统产生标准输出数据,并可批量保存,同时自动命名标准输出数据的后缀; *文本高亮对比 在判题后,可以直接在本系统中将自己的程序输出和标准输出进行高亮的文本差异对比,操作类似于一些文本对比软件,在一定程度上可以较方便地发现WA代码的出错细节; *支持不限时执行代码 这个功能可以在一定程度上检测TLE代码的算法是否正确的,当然,不能是跑一天都没跑出来的程序; *打包与加密测试数据 使用加密后的数据可以正常判题,但不显示标准输出。这个功能是为了弥补放出去给别人评测的测试数据是明文的缺陷。加密之后评测方就看不到测试数据。这样就既可以实现离线评测,又可以实现Online Judge上的对测试数据屏蔽; ACM-ICPC简介: ACM国际大学生程序设计竞赛(简称ACM-ICPC)是由国际计算机界具有悠久历史的权威性组织ACM学会(Association for Computing Machinery)主办,是世界上公认的规模最大、水平最高、参与人数最多的大学生程序设计竞赛,其宗旨是使大学生能通过计算机充展示自己析问题和解决问题的能力。 ACM-ICPC的每一道题,都具备题目、需求描述、输入格式描述、输出格式描述、样例输入和样例输出共六大信息,有些题目还有一定的提示。此外,裁判还额外存储了关于该题的一组或多组对选手屏蔽的标准输入和标准输出数据,这些测试数据已经经过验证符合题意要求。当用户提交一道题目的源码之后,裁判会将该源码放入评测系统中编译运行,并使用标准输入作为用户程序的输入,然后获取用户程序的输出,接着,将用户程序输出和标准输出比较,最后返回给用户一个评判结果。评判结果包括:Accepted(测试通过)、Compile Error(编译失败)、Memory Limit Exceed(内存超出限制)、Presentation Error(格式错误)、Runtime Error(运行时错误,可能是数组越界,改写只读的内存,除零,栈或堆溢出等错误)、Time Limit Exceed(时间超出限制)、Wrong Answer(答案错误)等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值