俗话说得好,只看理解其意,不如自己做题。我们只有自己理解后加以运用知识才会属于我们自己。就拿今天的测试来讲吧。(原先想讲点别的的,但觉得自己可能未完全搞懂,就先讲这个吧)
题目描述
给出两个序列 pushed 和 poped 两个序列,其取值从 1 到 �(�≤100000)n(n≤100000)。已知入栈序列是 pushed,如果出栈序列有可能是 poped,则输出 Yes
,否则输出 No
。为了防止骗分,每个测试点有多组数据。
输入格式
第一行一个整数 �q,询问次数。
接下来 �q 个询问,对于每个询问:
第一行一个整数 �n 表示序列长度;
第二行 �n 个整数表示入栈序列;
第三行 �n 个整数表示出栈序列;
输出格式
对于每个询问输出答案。
咋一看好像很简单,实际上不是。我开始是干的什么,直接就栈进栈出,像个呆瓜一样还在那里问为什么,搞了半天,我发现一丝不对劲了。首先是那个“为了防止骗分”是什么意思,如果一个简单的题目会写这种东西吗?那么真相只有一个,这道题还有更深层次的问题在其中。后面仔细一看,额?是不是出栈可以一下一下出呢?就是2143也是符合的这种方式的。其实题目也很明显了,它用的可能,全都怪我,没有仔细去看题。白白浪费了半个小时。那么明白了题意的思路又是怎样的呢?首先,既然要用栈来解决这个问题,还要出栈,那么就避免不了要用到中间数组。
#include <stdio.h>
#include <stdlib.h>
int arr[100002];
int brr[100002];
int crr[100002];//上面讲了
int main()
{
int a,b=0,n,i;
scanf("%d",&a);//循环次数
while(a>0)
{
scanf("%d",&n);
for(b=0;b<n;b++)
{
scanf("%d",&arr[b]);
}
for(b=0;b<n;b++)
{
scanf("%d",&brr[b]);
}//输入进两数组里面
int c = 0, d = 0;
for(i = 0; i < n; i++) {
crr[d] = arr[i];
while(brr[c] == crr[d] && d > -1 && c != n)
{
d--;
c++;
}//出栈操作,找到和arr数组中相同的“头”,没找到就下一位,找到了之后呢就踢出去,直到踢完。
d++;
}
if(d==0)这个如果踢完了就是0,没踢完就啥也不是
printf("Yes\n");
else
printf("No\n");
a--;
}
return 0;
}
再讲一下被EX的一道题目
假设一个表达式有英文字母(小写)、运算符(+、-、*、/)和左右小(圆)括号构成,以 @ 作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出 YES;否则输出 NO。表达式长度小于
255
255,左圆括号少于
20
20 个。
输入格式
一行:表达式。
输出格式
一行:YES 或 NO。
一眼看去,哇塞,白给的题目( •̀ ω •́ )y,哈哈哈,一检查,Unaccepted。这就告诉我,鼻子上面长两蛋,不要只会眨吧不会看。)))(((@是不可取的。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char arr[260];
int a,b=0;
scanf("%s",arr);
while(arr[a]!='\0')
{
if(arr[a]=='(')
{
b=b+1;
}
if(arr[a]==')')
{
b=b-1;
}//输入没啥的
if(b<0)
{
break;
}//这才是重点,因为没有哪家的括号是))((这样长的,就是这个我还自我怀疑了半天
a++;
}
if(b==0)
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
这么些题目下来,我终于知道,不能太单纯,不然会吃大亏。好了,天色渐晚,今天就到这了。