首先,一定一定要多读几遍题目,拿到问题后,要先将其转换为数学模型,题目上要求很多的
特别是要你判断能不能的时候,往往可以转化为数学模型,用到直接的关系,数列公式,二项式定
理等等,如果只是按照题上的要求一次次迭代,就有可能会超时。还有pta上的题目要求还是很隐
晦的,一定要吃透它到底说的什么意思,将其转化为数学问题。例如
pta上的pta初级 1003“我要通过”
这道题,它正确的条件最终就可以转换为 a = b * c;且b != 0
当然出现的字符顺序也有要求,但这个问题不大,可以比较轻松判断出来。
最开始做的:
#include<stdio.h>
#include<string.h>
int main()
{
char word[101];
int n;
scanf("%d", &n);
getchar();
for(;n > 0;n--){
int isture = 1, goout = 0;
gets(word);
int len = strlen(word);
int i = 0;
for(i = 0;word[i] != '\0';i++){
if(word[i] != 'A'&&word[i] != 'P'&&word[i] != 'T'){
goout = 1;
isture = 1;
break;
}
if(goout)
break;
if(word[i] == 'P'&&word[i + 1] == 'A'&&word[i + 2] == 'T')
if((len - i - 3) == i)
if(i != 0){
int cnt;
for(cnt = 0; cnt < i;cnt++){
if(word[cnt] != word[i + 3 + cnt] || word[cnt] != 'A')
break;
}
if(cnt == i)
isture = 0;
break;
}
else{
isture = 0;
break;
}
if(word[i] == 'P'&&word[i + 1] == 'A'&&word[i + 2] == 'A'&&word[i + 3] == 'T')
if((len - i - 4) >= i){
int a = i;
i--, len--;
for(;i > -1; i--, len--)
if(word[i] != word[len] || word[i] !='A'){
break;
}
if(i == -1)
isture = 0;
for(;len > a + 3;len--)
if(word[len] != 'A'){
isture = 1;
break;
}
break;
}
}
if(isture)
printf("NO");
else
printf("YES");
if(n > 1)
printf("\n");
}
return 0;
}
代码又臭又长不说,关键题没读清,有的测试用例没通过。(这是错误答案哈)
后来在别人的点醒下,才看到了a b c 之间存在关系, 于是代码就简化了很多:
#include<stdio.h>
#include<string.h>
int main()
{
char word[101];
int n;
scanf("%d", &n);
getchar();
for(;n > 0;n--){
int isture = 1, i;
gets(word);
for(i = 0;word[i] != 0;i++){
if(word[i] == 'P'){
int a= i, b = 0, c = 0;
for(i++;word[i] == 'A';i++)
b++;
if(word[i] == 'T'){
for(i++;word[i] != '\0';i++){
if(word[i] != 'A')
break;
else
c++;
}
}
else
break;
if(word[i] == '\0' && b != 0 && c == b * a)
isture = 0;
}
else
if(word[i] != 'A')
break;
}
if(isture)
printf("NO");
else
printf("YES");
if(n > 1)
printf("\n");
}
return 0;
}
当然,这个也有些不足,结构不太美观,而且变量的命名简短,实际意义不清晰。
学习的路还很长。