zoukankan      html  css  js  c++  java
  • 算法99---网易2019笔试

    题一:

    '''
    判断一个列表中的每个数的左右两个数之和是否大于当前的数,如果是,就能成环;如果否,就不能成环
    '''

    作者:NotDeep
    链接:https://www.nowcoder.com/discuss/216237
    来源:牛客网

    思路

    首先对数组进行排序,除了最后一个数字,都满足相邻两个数字大于自己
    对于最后一个数字,交换最后两个数字,判断是否满足条件即可。

    如:

    输入:1 2 4

    输出:NO

    输入:1 2 3

    输出:YES

    参考代码

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #include <iostream>
    #include <string>
    using namespace std;
     
    const int N = 1e5 + 10;
    int a[N];
    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]);
            sort(a,a+n);
            swap(a[n-2],a[n-1]);
            bool f = 0;
            for (int i = 0;i < n;i++)
            {
                int pre = (i-1+n)%n;
                int sub = (i+1) % n;
                if (a[pre] + a[sub] <= a[i]) f = 1;
            }
            if (f) puts("NO");
            else
            {
                puts("YES");
            }
        }
        return 0;
    }

    题二:

    '''
    给数组arr=[a1,a2,...,an]
    对于数组中的两个下标,如果ai+aj=奇数,就可以交换ai和aj
    现在允许使用操作次数不限制,希望通过若干次操作可以得到字典序最小的数组
    '''

    如:

    输入:7 3 5 1

    输出:7 3 5 1

    思路:

    只要数组中同时出现了奇数和偶数,那么直接对数组进行排序即可。

    代码:

    作者:NotDeep
    链接:https://www.nowcoder.com/discuss/216237
    来源:牛客网
    
    #include <iostream>
    #include <algorithm>
    #include <stdio.h>
    #include <cstring>
    #include <cmath>
     
    const int N = 1e5 + 10;
     
    int a[N];
     
    using namespace std;
    int main()
    {
        int n;
        cin >> n;
        int odd = 0,even = 0;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            if(a[i]%2==0)
                even++;
            else
                odd++;
        }
        if(even>0 && odd>0)
            sort(a,a+n);
        for(int i=0;i<n;i++)
        {
            printf("%d%c", a[i], i == n - 1 ? '
    ' : ' ');
        }
        return 0;
    }

    题三:优秀的01序列

    http://www.lyqhahaha.xyz/P/72/

    给出优秀的01序列S,其中满足两个操作,S+S,reverse(S)也是优秀的01序列,则再给出T序列,请判断T是否是优秀的01序列。

    且reverse(S)操作是0变1,1变0,如果最前面为0则要删掉,如S=110011,reverse(S) = 1100,S+S= 110011110011

    代码:

    作者:NotDeep
    链接:https://www.nowcoder.com/discuss/216237
    来源:牛客网
    
    #include<bits/stdc++.h>
    using namespace std;
    char s[1005] , t[1005];
    int h[1005];
    const int base = 773117 , mod = 1e9 + 7;
    int pr[1005];
    int s1[1005] , s2[1005] , len;
    int pos[1005];
    int n , m;
    int ghash(int l,int r)
    {
        return ((h[r] - 1LL*h[l-1]*pr[r-l+1]) % mod + mod ) % mod;
    }
    int dp[1005][2];
    void solve()
    {
        scanf("%s",s+1);
        scanf("%s",t+1);
        n = strlen(s + 1) , m = strlen(t + 1) ;
        for(int i = 1;i <= m;i++) h[i] = (1LL * h[i - 1] * base + t[i] - '0') % mod;
        int pc = 0;len = 0;
        for(int i = 1;i <= n;i++) {
            if(s[i] != s[i - 1]) {
                int h1 = 0 , h2 = 0;
                for(int j = i;j <= n;j++) {
                    h1 = (1LL * h1 * base + s[j] - '0') %mod;
                    h2 = (1LL * h2 * base + 1 + '0' - s[j]) % mod;
                }
                if(!pc) {
                    ++len ; s1[len] = h1 ; s2[len] = h2;
                }
                else {
                    ++len ; s1[len] = h2 ; s2[len] = h1 ;
                }
                pos[len] = (n - i + 1) ;
                pc ^= 1;
            }
        }
        memset(dp , 0 , sizeof(dp)) ; dp[0][1] = 1;
        for(int i = 1;i <= m;i++) {
            if(i >= pos[1] && ghash(i - pos[1] + 1 , i) == s1[1] && (dp[i - pos[1]][0] || dp[i - pos[1]][1])) dp[i][1] = 1;
            for(int j = 2;j <= len;j++) {
                if(i >= pos[j] && ghash(i - pos[j] + 1 , i) == s1[j] && (dp[i - pos[j]][0] || dp[i - pos[j]][1])) {dp[i][0] = 1;break;}
            }
            for(int j = 1;j <= len;j++) {
                if(i >= pos[j] && ghash(i - pos[j] + 1 , i) == s2[j] && dp[i - pos[j]][0]) {dp[i][0] = 1;break;}
            }
        }
        if(dp[m][0] || dp[m][1]) puts("YES");
        else puts("NO");
        return ;
    }
    int main()
    {
        int t;scanf("%d",&t) ;
        pr[0] = 1;
        for(int i = 1;i <= 1000;i++) pr[i] = 1LL * pr[i - 1] * base % mod;
        while(t--) solve() ;
        return 0;
    }
     
  • 相关阅读:
    AcWing:141. 周期(KMP)
    暑假集训
    AcWing:112. 雷达设备(贪心 + 笛卡尔坐标系化区间)
    AcWing:111. 畜栏预定(贪心 + 小根堆)
    20200207总结
    Miku and Generals(二分图染色+可行性dp)
    20200205总结
    Coding Contest(最小费用最大流)
    Wannafly-Winter-Camp day5总结
    Wannafly-Winter-Camp day4总结
  • 原文地址:https://www.cnblogs.com/Lee-yl/p/11296210.html
Copyright © 2011-2022 走看看