Given a stack which can keep MM numbers at most. Push NN numbers in the order of 1, 2, 3, ..., NN and pop randomly. You are supposed to tell if a given sequence of numbers is a possible pop sequence of the stack. For example, if MM is 5 and NN is 7, we can obtain 1, 2, 3, 4, 5, 6, 7 from the stack, but not 3, 2, 1, 7, 5, 6, 4.
每个输入文件包含一个测试用例。对于每种情况,第一行包含3个数字(不超过1000):MM(堆栈的最大容量),NN(推送序列的长度)和KK(要检查的弹出序列的数量)。然后KK线跟随,每个包含NN数字的弹出序列。一行中的所有数字由空格分隔。
对于每个弹出序列,如果确实是堆栈的可能弹出序列则在一行中打印“YES”,否则打印为“NO”。
1 #include<iostream>
2 using namespace std;
3 int tongji(bool f[],bool f1[],int x)
4 {
5 int count=0;
6 for(int i=1;i<=x;i++)
7 if(f[i]==0&&f1[i]==0)count++;
8 return count;
9 }
10 int main()
11 {
12 /*若当前需要输出X,判断:
13 1,若栈为空,判断X是否大于K,是则NO,否则继续。
14 2,X的下一个数若小于X,判断栈顶元素是否与其相等,是则继续,否则NO。
15 3,X的下一个数若大于X,判断栈剩下的空间是否能容纳没输出过的&&比其小的元素,是则继续,否则NO。
16 */
17 int s[10000],top,a[10000],m,n,k,i,j;
18 cin>>m>>n>>k;
19 while(m--)
20 {
21 top=0;
22 bool f[10000]={0};
23 bool f1[10000]={0};
24 for(i=1;i<=n;i++)
25 cin>>a[i];
26 for(i=1;i<n;i++)
27 {
28 if(top==0)
29 {
30 if(tongji(f,f1,a[i])>k)break;
31 else
32 {
33 j=1;
34 while(j<=a[i])
35 {if(f[j]==0&&f1[j]==0)s[++top]=j;f1[j]=1;j++;}
36 f[a[i]]=1;
37 top--;
38 f1[a[i]]=0;
39 }
40 }
41 if(a[i+1]<a[i])
42 {
43 if(a[i+1]!=s[top])break;
44 else {f[i+1]=1;top--;}
45 }
46 if(a[i+1]>a[i])
47 {
48 if(tongji(f,f1,a[i+1])>k-top)break;
49 else
50 {
51 j=1;
52 while(j<=a[i+1])
53 {if(f[j]==0&&f1[j]==0)s[++top]=j;f1[j]=1;j++;}
54 f[a[i]]=1;
55 top--;
56 f1[a[i]]=0;
57 }
58 }
59 }
60 if(i==n)cout<<"YES"<<endl;
61 else cout<<"NO"<<endl;
62 }
63 return 0;
64 }
这道题目,首先弄懂英文题意就花了很多时间,考试时候因为看不懂所以直接没做……
懂了题意之后,AC掉花了差不多2个小时……
所以即使考试时候看明白题意我也不会当场做出来啊- -
真心觉的自己菜得不行
不知不觉已经大二下学期了,然而自己的水平其实和大一时候没什么区别,
就拿畅通工程的问题来说,考了不下3次,每一次不会都不知道把它弄懂
自己了解的算法太少了,虽然这学期才开始上算法课,但是比赛什么的已经早早用到了
完全可以多做一些代表性的题目,拿出来好好研究一下,哪怕一晚上研究一道题,以后也可以举一反三利用了。
还有十多天比赛,在这之前每天弄明白一到两个典型的算法问题,到时候也可以有很大的进步了,希望不要辜负自己吧