4.12日字节跳动笔试1,3,4题解,求一波第2题题解

1.
#include <iostream>

using namespace std;

const int maxn = 1000005;
int a[maxn],b[maxn],c[maxn];

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        for(int i = 0; i < n; i++) scanf("%d",&a[i]);
        for(int i = 0; i < n; i++) scanf("%d",&b[i]);
        for(int i = 0; i < n; i++) c[i] = b[i] - a[i];
        int l = 0;
        while(l < n && c[l] == 0) l++;
        if(l == n)
        {
            printf("YES\n");
        }
        else
        {
            int r = l + 1;
            while(r < n && c[r] != 0) r++;
            bool flag = true;
            for(int i = l; i < r - 1; i++)
            {
                if(c[i] != c[i + 1] || c[i] < 0)
                {
                    flag = false;
                    break;
                }
            }
            if(!flag)
            {
                printf("NO\n");
            }
            else
            {
                bool flag2 = true;
                for(int i = r; i < n; i++)
                {
                    if(c[i] != 0)
                    {
                        flag = false;
                        break;
                    }
                }
                if(!flag)
                {
                    printf("NO\n");
                }
                else
                {
                    printf("YES\n");
                }
            }
        }
    }
    return 0;
}
3.
#include <iostream>
#include <algorithm>
using namespace std;

const int maxn = 1000005;
typedef long long LL;
int a[maxn],b[maxn];

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i = 0; i < n; i++) scanf("%d",&a[i]);
    for(int i = 0; i < m; i++) scanf("%d",&b[i]);
    sort(a, a + n);
    sort(b, b + m);
    LL ans = 0;
    for(int i = 0; i < m; i++)
    {
        int *p = lower_bound(a,a + n,b[i]);
        if(!p) ans += (b[i] - a[n - 1]);
        else
        {
            if(*p == b[i]) ans += 0;
            else
            {
                if(p == a) ans += b[i];
                else ans += (b[i] - *(p - 1));
            }
        }
    }
    printf("%lld\n",ans);
    return 0;
}
4.
#include <iostream>

using namespace std;
const int maxn = 100005;
int a[maxn];
int dpl[maxn],dpr[maxn];

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        for(int i = 0; i < n; i++) scanf("%d",&a[i]);
        dpl[0] = 0;
        for(int i = 1; i < n; i++)
        {
            if(a[i] >= a[i - 1])
            {
                int j = dpl[i - 1];
                while(j - 1 >= 0 && a[i] >= a[j - 1])
                {
                    j = dpl[j - 1];
                }
                dpl[i] = j;
            }
            else
            {
                dpl[i] = i;
            }
        }
        dpr[n - 1] = n - 1;
        for(int i = n - 2; i >= 0; i--)
        {
            if(a[i] >= a[i + 1])
            {
                int j = dpr[i + 1];
                while(j + 1 < n && a[i] >= a[j + 1])
                {
                    j = dpr[j + 1];
                }
                dpr[i] = j;
            }
            else
            {
                dpr[i] = i;
            }
        }
        for(int i = 0; i < n; i++)
        {
            if(i == n - 1) printf("%d\n",dpr[i] - dpl[i]);
            else printf("%d ",dpr[i] - dpl[i]);
        }
    }
    return 0;
}




#字节跳动412笔试题##字节跳动##笔试题目#
全部评论
有没有java通过的啊。。我本地没问题 测试用例全是0通过 😴
点赞 回复 分享
发布于 2020-04-12 21:26
第二题贪心。从后往前扫,遇到比后面长的就掰n次,n是把他掰成低于后面长度的最小值。然后接着往前搜,一直到头。
点赞 回复 分享
发布于 2020-04-12 21:22
#include<bits/stdc++.h> using namespace std; int main() {     int n;     cin >> n;     vector<int> mu(n,0);     for(int i=0;i<n;i++)     {         cin >> mu[i];     }     int res=0,min_pos;     for(int i= n-2;i>=0;i--)     {         int left = mu[i],right=mu[i+1];         if(left>right)         {             int chu = left / right;             int yu = left % right;             if(yu>0)             {                 res += chu;                 mu[i] = mu[i] / (chu+1);             }             else             {                 res += chu-1;                 mu[i] = mu[i] / chu;             }         }     }     cout<< res << endl;     return 0; }
点赞 回复 分享
发布于 2020-04-12 21:21

相关推荐

双非阴暗爬行:我来看看笑死我了,这名字取得好想笑(没有不好的意思)
点赞 评论 收藏
分享
评论
1
9
分享

创作者周榜

更多
牛客网
牛客企业服务