OJ刷題之1035:列車長的煩惱

OJ刷題之1035:列車長的煩惱

1、題目以及要求

description
John是個小列車站的站長,每次列車在這裏重新編組時他就很煩惱。因爲站上只有一個人字形的編組軌道(如圖),所有的列車車廂都是從人字軌的右邊依次進去,從左邊出來。但有一些編組順序John總編不出來,John懷疑有些編組順序是不可能完成的,可John又找不出那些是順序是可以編組出,那些不可以。請你寫一個程序幫助John辨別哪些編組可以完成,哪些不能完成。

在這裏插入圖片描述
輸入:
第一行是一個整數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<stdio.h>
#include<iostream>
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<iostream>
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章