zoukankan      html  css  js  c++  java
  • 9.6字节跳动笔试题解

    ==
    第一题
    题意:走阶梯,有限制条件:1.只能走一步或者走两步 2.不能连续跳两步
    思路:dp[i][j]表示通过跳j步跳到i个的方案数,那么显然dp[i][1]==dp[i][1]+dp[i-1][2]+dp[i-1][1]
    而dp[i][2]=dp[i][2]+dp[i-2][1],最后输出就好了,我用的是python,其他语言的话可能要开long long或者大数

     1 dp=[]
     2 for i in range(0,105):
     3     dp.append([0,0,0,0])
     4 dp[1][1]=1
     5 dp[2][2]=1
     6 dp[2][1]=1
     7 n=int(input())
     8 for i in range(3,105):
     9     dp[i][1]=dp[i][1]+dp[i-1][2]+dp[i-1][1]
    10     dp[i][2]=dp[i][2]+dp[i-2][1]
    11 print(dp[n][1]+dp[n][2])

    第二题:
    题意:求左边第一个比a[i]大的a[j]的坐标j,定义为L[i]=j,如果没有则L[i]=0
    和右边第一个比a[i]的大的a[k]的坐标k,定义R[i]=k,如果没有则R[i]=0
    求最大的R[i]*L[i]
    做法:没有什么好i说的,单调栈裸题,建议百度看一下。求出所有的R[i]和L{i],然后求他们的乘积即可

     1 #include<cstdio>
     2 #include<stack>
     3 #include<algorithm>
     4 using namespace std;
     5 typedef long long ll;
     6 const ll N=1e5+5;
     7 ll L[N],R[N];
     8 ll a[N];
     9 int main()
    10 {
    11     ll n;
    12     scanf("%lld",&n);
    13     for(int i=1;i<=n;i++)
    14     {
    15         scanf("%lld",&a[i]);
    16     }
    17     stack<ll>st1;
    18     stack<ll>st2;
    19     for(int i=1;i<=n;i++)
    20     {
    21         while(!st1.empty()&&a[i]>=a[st1.top()])
    22             st1.pop();
    23         if(st1.empty())
    24             L[i]=0;
    25         else
    26             L[i]=st1.top();
    27         st1.push(i);
    28     }
    29     for(int i=n;i>=1;i--)
    30     {
    31         while(!st2.empty()&&a[i]>=a[st2.top()])
    32             st2.pop();
    33         if(st2.empty())
    34             R[i]=0;
    35         else
    36             R[i]=st2.top();
    37         st2.push(i);
    38     }
    39     ll ans=0;
    40     for(int i=1;i<=n;i++)
    41         ans=max(L[i]*R[i],ans);
    42     printf("%lld
    ",ans);
    43     return 0;
    44 }

    第三题:
    题意:给定n长的序列,可以把序列乘以m 倍变成n*m倍的,求最大连续和,且至少包含一个元素
    做法:1.求出这个序列本身的最大连续和(这种情况下至少选一个)
          2.求包含x个一整个序列(长度为n的)的最大连续和,这种情况下要求序列的和必须大于等于0,并且m大于等于2
          将二者求最大值,第一种就是简单的最大连续和,注意一下至少选一个,第二题通过dp求出从左至右包含当前元素的最大连续和(从右至左同理)
          那么,答案显然就两者之和加上中间包含的序列总和。 

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 typedef long long ll;
     5 const ll N=1e5+5;
     6 const ll INF=1e17;
     7 ll dp[N][2];
     8 ll a[N*2];
     9 int main()
    10 {
    11     ll n,m,i;
    12     scanf("%lld %lld",&n,&m);
    13     ll maxsum=0;
    14     ll sum=0;
    15     ll ans=-INF;
    16     for( i=1;i<=n;i++)
    17     {
    18         scanf("%lld",&a[i]);
    19         sum+=a[i];
    20         if(maxsum+a[i]<0)
    21         {
    22             maxsum=0;
    23         }
    24         else
    25         {
    26             maxsum+=a[i];
    27             ans=max(maxsum,ans);
    28         }
    29         ans=max(ans,a[i]);
    30     }
    31     dp[n][0]=a[n];
    32     dp[1][1]=a[1];
    33     for(i=2;i<=n;i++)
    34     {
    35         dp[i][1]=max(dp[i-1][1]+a[i],a[i]);
    36     }
    37     for(i=n-1;i>=1;i--)
    38     {
    39         dp[i][0]=max(dp[i+1][0]+a[i],a[i]);
    40     }
    41     if(sum>0&&m>=2)
    42     {
    43         ll k=(m-2)*sum;
    44         ans=max(k+dp[1][0]+dp[n][1],ans);
    45     }
    46     if(m>=2)
    47     {
    48         ans=max(dp[1][0]+dp[n][1],ans);
    49     }
    50     printf("%lld
    ",ans);
    51     return 0;
    52 }

    第四题:没写了,据说输出0也有20%,想着三题差不多就跑路了

  • 相关阅读:
    CSS div 塌陷问题
    jquery 选择器包含特殊字符
    ASP.NET Core Action 读取流
    SQL 列拼接使用
    bootstrap div 固定
    Jquery 操作HTML5自定义属性data-*
    Vue 页面加载闪现代码问题
    iframe 加载完成事件
    closest
    【开发者的精进】 数据驱动下的程序设计
  • 原文地址:https://www.cnblogs.com/Carits/p/13621520.html
Copyright © 2011-2022 走看看