30天编程练习(六)

1021 函数题

解析:题目理解起来比较复杂,但找到规律可以发现其实就是对3取模


#include <iostream>  

using namespace std;  
int main()  
{  
    int n;  
    while(cin>>n)  
    {   
        if(n%4==2)  
        {  
            cout<<"yes"<<endl;  
        }  
        else  
            cout<<"no"<<endl;  
    }  
    return 0;  




1022 火车入站问题1

题意:假设A入站之后B也入站,则A不能离开直到B离开。

解析:本题是一个对栈的应用题,每次判断将要入站的火车和输出序列的首元素是否相同,若相同,则入站出站;否则判断栈顶元素和首元素,相同则出栈,不相同则压入,继续重复上述步骤。

#include <stdio.h>  
#include <string.h>  
#include <iostream>  
#include <stack>  
using namespace std;  
int main()  
{  
    int n,i,j,k;  
    char a[10],b[10],c[10];  
    while(~scanf("%d%s%s",&n,a,b))  
    {  
        getchar();  
        stack<char>s;  
        while(!s.empty())  
        s.pop();    
        i=j=k=0;  
        while(i<n)  
        {  
            s.push(a[i++]);  
            c[k++]=1;  
            while(!s.empty()&&s.top()==b[j])  
            {  
                s.pop();  
                j++;  
                c[k++]=0;  
            }  
        }  
            if(s.empty()==1)  
            {   
               printf("Yes.\n");  
               {  
                   for(i=0;i<k;i++)  
                   {  
                       if(c[i]==1)  
                          printf("in\n");   
                       else  
                          printf("out\n");  
                   }  
               }  
            }   
            else  
            {  
                printf("No.\n");  
            }  
        printf("FINISH\n");  
    }  
    return 0;  

}


1023 火车进站问题2

题意:本题和上一题差不多一样,这次求的是N辆严格递增输入的火车有几种出站情况

解析:用的卡特兰数加大数乘法,令h(0)=1,h(1)=1,catalan数满足递推式[1]:
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)


#include<stdio.h>
#include<string.h>
int main()
{
 int i,j,s,temp,n,k;
 int a[101][61];
 memset(a,0,sizeof(a));
 a[0][0]=0;a[1][0]=1;a[2][0]=2;
 for(i=3;i<101;i++)
 { 
  for(j=0,s=0,temp=0;j<61;j++)
  {
   temp=s+a[i-1][j]*(4*i-2);
   a[i][j]=temp%10;
   s=temp/10;


  }
  for(j=60,s=0,temp=0;j>=0;j--)
  {
   temp=s*10+a[i][j];
   a[i][j]=temp/(i+1);
   s=temp%(i+1);
  }


 }
 while(scanf("%d",&n)!=EOF)
 {
  k=60;
  while(k>=0&&a[n][k]==0) k--;
  for(i=k;i>=0;i--)
  printf("%d",a[n][i]);
  printf("\n");
 }
 return 0;

}



阅读更多
博主设置当前文章不允许评论。

没有更多推荐了,返回首页