题目描述
铁路进行列车调度时,常把站台设计成栈式结构的站台,试问:
设有编号为1到n的n辆列车,顺序开入栈式结构的站台,则可能的出栈序列有多少种?
设有编号为1到n的n辆列车,顺序开入栈式结构的站台,则可能的出栈序列有多少种?
输入
输入包含多组测试数据。每组为一个正整数n(1<=n<=20),表示有n辆列车。
输出
输出可能的出栈序列有多少种。
样例输入
4
3
样例输出
14
5
思路:利用公式ans=1/(n+1)*(2*n)!/n! 计算过程要注意溢出,进行必要的化简。
代码如下:
#include<cstdio>
#include<cmath>
typedef long long LL;
int main()
{
LL n;
while(~scanf("%lld",&n))
{
LL i,ans=1*pow(2,(n+1)/2),j=1;
for(i=2*n-1;i>n;i-=2)
ans=ans*i/j++;
printf("%lld\n",ans/(n+1));
}
return 0;
}
另:对于火车出站问题的另一类判断出站序列是否合理。 不能出现“大小中”的情况
代码如下:
#include<cstdio>
#include<stack>
using namespace std;
const int N=1005;
int n,A[N];
int main()
{
while(~scanf("%d",&n))
{
stack<int>s;
int a=1,b=1;
for(int i=1; i<=n; i++)
scanf("%d",&A[i]);
int ok=1;
while(b<=n)
{
if(a==A[b])
{
a++,b++;
}
else if(!s.empty()&&s.top()==A[b])
{
s.pop();
b++;
}
else if(a<=n) s.push(a++);
else
{
ok=0;
break;
}
}
printf("%s\n",ok?"Yes":"No");
}
return 0;
}