算法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 ? '\n' : ' ');
    }
    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;
}

 

 

 

posted on 2019-08-03 20:39  吱吱了了  阅读(474)  评论(0编辑  收藏  举报

导航