PAT 1003. 我要通过!(20) 有个测试点过不了 求大佬解答

不继 2018-11-14 02:56:53


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

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

字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
如果 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





#include <stdio.h>
int main()
{
int n, flag, p, t;
int cont_a, cont_b, cont_c;
char a[105];
scanf("%d" ,&n);
getchar();
while(n--)
{
p = 0;
t = 0;
flag = 1;
cont_a = 0;
cont_b = 0;
cont_c = 0;
scanf("%s" ,a);
for (int i=0; a[i]!='\0'; i++)
{
if(a[i] != 'A' && a[i] != 'T' && a[i] != 'P')
{
printf("NO\n");
flag = 0;
break;
}
if(a[i] == 'P')
{
p++;
if(p==2)
{
printf("NO\n");
flag = 0;
break;
}
}
if(a[i] == 'T')
{
t++;
if(t==2 || p==0)
{
printf("NO\n");
flag = 0;
break;
}
}
if(a[i] == 'A')
{
if(p == 0)
{
cont_a++;
}
else if(p == 1 && t == 0)
{
cont_b++;
}
else if(p == 1 && t == 1)
{
cont_c++;
}
}
}
if(flag == 1 && cont_b ==0)
{
printf("NO\n");
}
else if(flag == 1 && cont_a * cont_b == cont_c)
{
printf("YES\n");
}
else if(flag == 1 && cont_a * cont_b != cont_c)
{
printf("NO\n");
}
}
return 0;
}




测试点一过不了 求大佬指正
...全文
1074 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_26067927 2020-05-25
  • 打赏
  • 举报
回复
引用 9 楼 lin5161678 的回复:
APAAATAA 为什么是NO
这肯定是NO啊,中间三个A前面一个A,乘起来后面得是三个A才行
旺 崽 2019-07-12
  • 打赏
  • 举报
回复 5
你对字母T的判断有问题,可以试试“PA”,你的输出是“YES”
不继 2018-12-26
  • 打赏
  • 举报
回复
谢谢各位大佬的指点
@风轻云淡_ 2018-11-30
  • 打赏
  • 举报
回复
我的理解是abc代表的字母的个数也应该是一样的,APAAATAA===>APAATAA 应该能通过,当然只是猜测的,不一定对,随时接受批评。
@风轻云淡_ 2018-11-30
  • 打赏
  • 举报
回复
引用 9 楼 lin5161678 的回复:
APAAATAA
为什么是NO
lin5161678 2018-11-30
  • 打赏
  • 举报
回复
APAAATAA
为什么是NO
@风轻云淡_ 2018-11-30
  • 打赏
  • 举报
回复
看过你的程序,感觉有两个地方需要改进一下,一是char a[105];这里,你没有初始化,却在后面通过a[i]!='\0'来判断字符串是否结束,极有可能会出现问题,二是for循环里面的判断逻辑有点问题,你通过4个if来判断4种情况,其实完全可以用一个

if(a[i] == 'P')
{...}
else if(a[i] == 'T')
{...}
else if(a[i] == 'A')
{...}
else
{...}

来代替,好处是其一逻辑更加清楚,其二节省代码,其三不会有判断上的效率消耗,其实,这种在提交中不断发现自己的错误与不足,去改正才是意义所在,不要仅仅执着于一个完美通过啊。
mao_kerang 2018-11-30
  • 打赏
  • 举报
回复
解决了吗。我测试点5通过不了 请帮忙看看

#include<iostream>
#include<string.h>
using namespace std;
void judge(char *s);
int main()
{
	int n;
	cin >> n; //输入n行测试
	getchar();

	while (n-- > 0) //读取每行并作判断和输出
	{
		char str[100]; //保存读入的字符串
		cin.getline(str, 100);
		judge(str);
	}
	return 0;
}
/* 判断函数*/
void judge(char *s)
{
	char *p = s;
	int count[3] = { 0 }; // 记录_P_T_ 之间A的个数
	int index = 0, flag = 1;

	while (*p != '\0')
	{
		if (*p == 'A')
			count[index] += 1;
		else if (index == 0 && *p == 'P')//保证P只出现过一次
			index++;
		else if (index == 1 && *p == 'T') //保证T前面有过P
			index++;
		else
		{
			flag = -1; //出现其他、以及多余的字符,表示错误。
			break;
		}
		p++;
	}
	if (flag==1 && count[1]!=0 && (index == 2) && (count[2] == count[0] * count[1])) // 保证PT各有一个,且A的数量满足规律
		cout << "YES" << endl;
	else
		cout << "NO" << endl;
}
zangfong 2018-11-18
  • 打赏
  • 举报
回复
思路是对的,但是在写最后的if判断时还是有点问题。 按照你的判断,PA也会被判正确,你可以试试。 所以如果在你的代码上修改,那么判断条件就应该是
        if(flag == 1 && cont_b ==0)
        {
            printf("NO\n");
        }
        else if(flag == 1 && cont_a * cont_b == cont_c && p && t)
        {
            printf("YES\n");
        }
        else if(flag == 1)
        {
            printf("NO\n");
        }
整理一下,也就是如下的判断:
        if(flag == 1)
        {
            if(cont_b > 0 && cont_a * cont_b == cont_c && p && t) printf("YES\n");
            else printf("NO\n");
        }
引用 4 楼 qq_41172608 的回复:
[quote=引用 3 楼 cfjtaishan 的回复:] 网上有很多这样的demo程序,可以从网上搜一下的
这道题的大致思路我理解了, 提交以后只有第一个测试点过不了, 但是我找不出自己的程序里到底哪里出错了。。。所以希望大佬指出我程序的疏漏之处 ……[/quote]
自信男孩 2018-11-16
  • 打赏
  • 举报
回复
引用 4 楼 qq_41172608 的回复:
[quote=引用 3 楼 cfjtaishan 的回复:]
网上有很多这样的demo程序,可以从网上搜一下的

这道题的大致思路我理解了, 提交以后只有第一个测试点过不了, 但是我找不出自己的程序里到底哪里出错了。。。所以希望大佬指出我程序的疏漏之处 ……[/quote]
对比一下别人的demo程序,然后找出差异
不继 2018-11-14
  • 打赏
  • 举报
回复
引用 3 楼 cfjtaishan 的回复:
网上有很多这样的demo程序,可以从网上搜一下的

这道题的大致思路我理解了, 提交以后只有第一个测试点过不了, 但是我找不出自己的程序里到底哪里出错了。。。所以希望大佬指出我程序的疏漏之处 ……
自信男孩 2018-11-14
  • 打赏
  • 举报
回复
网上有很多这样的demo程序,可以从网上搜一下的
不继 2018-11-14
  • 打赏
  • 举报
回复
有没有大佬能指点一下

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧