OJ刷题之1035:列车长的烦恼

OJ刷题之1035:列车长的烦恼

    • 1、题目以及要求
    • 2、题目解析
    • 3、代码思路

1、题目以及要求

description
John是个小列车站的站长,每次列车在这里重新编组时他就很烦恼。因为站上只有一个人字形的编组轨道(如图),所有的列车车厢都是从人字轨的右边依次进去,从左边出来。但有一些编组顺序John总编不出来,John怀疑有些编组顺序是不可能完成的,可John又找不出那些是顺序是可以编组出,那些不可以。请你写一个程序帮助John辨别哪些编组可以完成,哪些不能完成。

OJ刷题之1035:列车长的烦恼_第1张图片
输入:
第一行是一个整数K,表示有多少个测试用例,以后每行一个测试用例,每行为n+1个整数,第一个整数为n 表示有多少节车厢,后面n个整数表示需要编组成的顺序。比如说3节车厢,按照1,2,3依次入轨编组,可以在左边形成1 2 3,1 3 2,2 1 3,2 3 1,321。

输出:
每行输出一个测试用例的结果。如果可以编组输出Yes,否则输出No。

Sample Input
2
3 3 1 2
4 1 2 3 4

Sample Output
No
Yes

2、题目解析

这个题目的问题涉及到数据结构中的出栈入栈原理 ,所以先要明白这一点才能进行解题。对于本题中的一组数据,从1到n进行入栈操作,比如数组1 2 3,可能的出栈序列如下
1 2 3(1入栈,然后出栈;2入栈,然后出栈;3 入栈,然后出栈。最终的出栈序列是1 2 3);
1 3 2(1入栈,然后出栈;2入栈,3 入栈,然后3出栈,然后2出栈。)
2 1 3(1入栈,2入栈,然后2出栈;然后1出栈;3 入栈,然后3出栈。)
2 3 1 同理;
3 2 1 同理。
只有3 1 2是不可能的出栈序列(3出栈时,则1,2必然已经入栈,则2要比1 先出栈)

3、代码思路

思路1
根据上面的分析,可以找到规律:
3 1 2是不可能的序列;2 4 1 5 3是不可能的序列……
位置i处后面比它小的数字必然是降序排列的,如果是升序则是不可能的序列。按照这个思路,可进行编程,代码如下:

#include
#include
using namespace std ;
int main(){
    int k,t,n,stack[100],flag=1;
    cin >> t ;
    while(t--){
        cin >> n ;
        for(int i=0;i<n;i++){
            cin>>stack[i];
        }
        flag=1;//刚开始忘记重新初始化,结果总是WA 
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                for(int k=j+1;k<n;k++){
                    if((stack[i]>stack[j])&&(stack[i]>stack[k])&&(stack[j]<stack[k]))
                    {
                        flag=0;
                        break;
                    }
                }
            }
        }
        if(flag==0) cout << "No" <<endl;
        else cout << "Yes" <<endl;
    }
    return 0;
}

提交结果:
Memory Time Lanuage Code Length
1432KB 234MS G++ 702B

思路2

#include
using namespace std ;
int main(){
	int k,n,stack[205],arr[205],mem,num,top;
	cin >> k;
	while(k--){
		cin >>n;
		for(int i=0;i<n;i++){
			cin >> arr[i];
		}
		mem = 1;
		top = 0;
		num = 0;
		stack[0] = -1;
		while(mem < n+1){
			stack[++top] = mem++;//进行入栈操作
			while(stack[top] == arr[num]) {//判断栈顶元素与当期数组元素是否相等,相等则出栈 
				top--;
				num++;
			}
		}
		if(top == 0)cout << "Yes" <<endl;
		else cout << "No" <<endl;
	}
	return 0;
}

提交结果
Memory Time Lanuage CodeLength
1432 KB 233 MS G++ 461 B

你可能感兴趣的:(OJ刷题)