zoukankan      html  css  js  c++  java
  • 寒假3

    L2-006 树的遍历 (25 分)

    给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

    输入格式:

    输入第一行给出一个正整数N(30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

    输出格式:

    在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

    输入样例:

    7
    2 3 1 5 7 6 4
    1 2 3 4 5 6 7
    

    输出样例:

    4 1 6 3 5 7 2
    用的是递归的思想,找到每一层的根节点,然后进行建树。最后用个bfs将这个树输出
    #include <iostream>
    #include<bits/stdc++.h>
    using namespace std;
    #include<queue>
    queue<int>que;
    int be[50],mid[50];
    struct node
    {
        int l;
        int r;
    }a[50];
    int build(int la,int ra,int lb,int rb)
    {
        if(la>ra)
            return 0;
        int rt=be[rb],p1,p2;
        p1=la;
        while(mid[p1]!=rt)
            p1++;
        p2=p1-la;
        a[rt].l=build(la,p1-1,lb,lb+p2-1);
        a[rt].r=build(p1+1,ra,lb+p2,rb-1);
        return rt;
    }
    void bfs(int x)
    {
        que.push(x);
        int flag=0;
        while(!que.empty())
        {
            x=que.front();
            if(!flag)
                cout<<x;
            else
                cout<<" "<<x;
            flag=1;
            que.pop();
            if(a[x].l)
                que.push(a[x].l);
            if(a[x].r)
                que.push(a[x].r);
        }
    }
    int main()
    {
     int n,i,j;
     cin>>n;
     for(i=0;i<n;i++)
     {
         cin>>be[i];
     }
     for(i=0;i<n;i++)
     {
         cin>>mid[i];
     }
     build(0,n-1,0,n-1);
     int root=be[n-1];
     bfs(root);
     return 0;
    }
    X  国王有一个地宫宝库。是  n  x  m  个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。 

    地宫的入口在左上角,出口在右下角。 

    小明被带到地宫的入口,国王要求他只能向右或向下行走。 

    走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。 

    当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。 

    请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。 
    输入
    输入一行3个整数,用空格分开:n  m  k  (1< =n,m< =50,  1< =k< =12) 

    接下来有  n  行数据,每行有  m  个整数  Ci  (0< =Ci< =12)代表这个格子上的宝物的价值 
    输出
    要求输出一个整数,表示正好取k个宝贝的行动方案数。该数字可能很大,输出它对  1000000007  取模的结果。
    样例输入
    2  3  2 
    1  2  3 
    2  1  5 
    样例输出
    14
    #include<iostream>
    #include<bits/stdc++.h>
    using namespace std;
    #define mod 1000000007
    int n,m,k;
    int a[50][50],vis[50][50][15][15];
    int dfs(int x,int y,int num,int maxx)
    {
      if(vis[x][y][num][maxx+1]!=-1)
      {
          return vis[x][y][num][maxx+1];
      }
      if(x==n&&y==m)
      {
          if(num==k)
          {
              return vis[x][y][num][maxx+1]=1;
          }
          else if(num==k-1&&a[x][y]>maxx)
          {
              return vis[x][y][num+1][a[x][y]+1]=1;
          }
          else
            return 0;
      }
      long long s=0;
      if(x+1<=n)
      {
          if(a[x][y]>maxx)
          {
          s+=dfs(x+1,y,num+1,a[x][y]);
          s%=mod;
          }
          s+=dfs(x+1,y,num,maxx);
          s%=mod;
      }
      if(y+1<=m)
      {
          if(a[x][y]>maxx)
          {
              s+=dfs(x,y+1,num+1,a[x][y]);
              s%=mod;
          }
          s+=dfs(x,y+1,num,maxx);
          s%=mod;
      }
      return vis[x][y][num][maxx+1]=s%mod;
    }
    int main()
    {
        cin>>n>>m>>k;
        int i,j;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                cin>>a[i][j];
            }
        }
        memset(vis,-1,sizeof(vis));
        dfs(1,1,0,-1);
        cout<<vis[1][1][0][0]<<endl;
        return 0;
    }
    有一只特别贪吃的大嘴,她很喜欢吃一种小蛋糕,而每一个小蛋糕有一个美味度,而大嘴是很傲娇的,一定要吃美味度和刚好为m的小蛋糕,而且大嘴还特别懒,她希望通过吃数量最少的小蛋糕达到这个目的.所以她希望你能设计一个程序帮她决定要吃哪些小蛋糕. 

    数据规模和约定 
    m  ≤  20000,小蛋糕总数量≤50. 

    输入
    先输入一行包含2个整数m、n,表示大嘴需要吃美味度和为m的小蛋糕,而小蛋糕一共有n种,下面输入n行,每行2个整数,第一个表示该种小蛋糕的美味度,第二个表示蛋糕店中该种小蛋糕的总数 
    输出
    输出一行包含一个整数表示大嘴最少需要吃的小蛋糕数量,若大嘴无法通过吃小蛋糕达到m的美味度和,则输出" > < “. 
    样例输入
    10  2 
    4  1 
    2  10 
    样例输出
    4
    dp问题
    #include <iostream>
    #include<bits/stdc++.h>
    using namespace std;
    #define inf 0x3f3f3f
    int t[51];
    int coin[51];
    int dp[20002] = {0};
    int main()
    {
        int n,m;
        cin>>m>>n;
        int i,j,k;
        for(i=1;i<=n;i++)
        {
            cin>>t[i]>>coin[i];
        }
        for(i=1;i<=m;i++)
        {
            dp[i]=inf;
        }
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=coin[i];j++)
            {
                for(k=m;k>=t[i];k--)
                {
                    dp[k]=min(dp[k-t[i]]+1,dp[k]);
                }
            }
        }
        if(dp[m]==inf)
            cout << "><" << endl;
       else cout << dp[m] << endl;
       return 0;
    }
     
  • 相关阅读:
    CSPS模拟 65
    CSPS模拟 64
    $color$有色图
    CSPS模拟 63
    CSPS模拟 62
    CSPS模拟 61
    CSPS模拟 60
    CSPS模拟 59
    go中单链表
    MYSQL-联合索引
  • 原文地址:https://www.cnblogs.com/kepa/p/10447333.html
Copyright © 2011-2022 走看看