1003 我要通过!

Posted CSU迦叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1003 我要通过!相关的知识,希望对你有一定的参考价值。

1. 总体思路是自己先写写,看看哪些字符串符合,找出规律,然后根据测试用例来矫正。

2. 用到了递推的方法,我使用countA[maxn]数组存放截至当前位置一共出现的A的个数。

3. 正确的字符串满足的条件是:P之前A的个数×P和T之间A的个数=T之后A的个数 PT之间A的个数不为0。要注意PT是不正确的字符串

AC代码如下

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
#include<stdlib.h>
#include<time.h>

using namespace std;
typedef long long LL;

const int maxn = 110;
const int MOD = 1000000007;
const int INF = 1000000000;//INF:下确界  
const LL SUP = (1LL<<63)-1;//SUP:上确界 
const double eps = 1e-5;

bool isPAT(char c){//判断一个字符是否是P、A、T中的一个 
	if(c=='P'||c=='A'||c=='T')return true;
	else return false;
}

bool judge(char s[maxn]){
	
	int L = strlen(s);
	int countA[maxn] = {0};//截至当前元素有多少个A 
	int indexP = 0;
	int indexT = 0;
	
	if(s[0]=='A')countA[0] = 1;
	else if(s[0]=='P'){
		countA[0] = 0;
		indexP = 0;
	}
	else return false; 
	
	for(int i=1;i<L;i++){
		if(isPAT(s[i])){//PorAorT
			if(s[i]=='A')countA[i] = countA[i-1]+1;//A
			else{
				countA[i] = countA[i-1];
				if(s[i]=='P')indexP = i;//P
				else indexT = i;//T
			} 
		}
		else return false;
	}
	
	//正确的字符串:P之前A的个数×P和T之间A的个数=T之后A的个数 且 PT之间A的个数不为0 
	bool res = (countA[indexP]*(countA[indexT]-countA[indexP])==countA[L-1]-countA[indexT])&&(countA[indexT]-countA[indexP]);

	if(res)return true;
	else return false;
	
}


int main(){
	
	
	//APAAATAA怎么错了
	//PAT PAAT PAAAT
	//APATA  APAATAA  APAAATAAA
	//AAPATAA  AAPAATAAAA  AAPAAATAAAAAA
	//AAAPATAAA AAAPAATAAAAAA AAAPAAATAAAAAAAAA
	int n;
	scanf("%d",&n);
	
	
	for(int i=0;i<n;i++){
		char s[maxn];
		scanf("%s",s);
		if(judge(s))printf("YES\\n");
		else printf("NO\\n");
	} 
	
	return 0;
}

以上是关于1003 我要通过!的主要内容,如果未能解决你的问题,请参考以下文章

JAVA1003 我要通过!(20分) PAT乙级 PAT (Basic Level)Practice (中文)

PTA-1003 我要通过!

1003.我要通过!(20)

[PAT Basic] 1003.我要通过!

1003 我要通过!

1003 我要通过!*