(试写一篇牛客博客,,,,看看体验感。。。)

wc,牛客的链接操作好sao啊~~~~~~

问题虫洞——A:https://ac.nowcoder.com/acm/contest/887/A


黑洞内窥:

给出一个"01"串,如果一个字符串在循环旋转中具有最小的词典编纂顺序,那么它就是完美的。

然后要求你切割“01”串,使得局部完美并输出(当然如果是整个串都完美的话。。就不需要切割了)

思维光年:

暴力,超级暴力;

ACcode:(贴上队友的暴力code。。。)

#include<bits/stdc++.h>
using namespace std;
 
string s,a[100],b[100];
int x,n,T,len;
int s0,s1,min0,x0,x1,max1;
 
int work(int x)
{
    if(s[x] == '1')
    {
        while(s[x] == '1') x++;
        return x - 1;
    }
    s0 = s1 = 0;
    while(s[x] == '0' && x < len) x++,s0++;
    while(s[x] == '1' && x < len) x++,s1++;
    min0 = s0;
    max1 = s1;
    n = x - 1;
    while(1)
    {
        x0 = x1 = 0;
        while(s[x] == '0' && x < len) x++,x0++;
        while(s[x] == '1' && x < len) x++,x1++;
        if(!x1) return n;
        if(s0 > x0)    ///0的个数小于起始段
        {
            n = x - 1;
            min0 = min(min0,x0);
            max1 = max(max1,x1);
            continue;
        }
        if(s0 == x0)  ///0的个数小于起始段
        {
            if(x1 > s1)  ///1的个数大于起始段
            {
                n = x - 1;
                max1 = max(max1,x1);
                continue;
            }
            else if(x1 < s1) return n;
            else
            {
                if(min0 < x0 || max1 > x1) return n;
                else
                {
                    n = x - 1;
                    continue;
                }
            }
        }
        else return n;
    }
}
 
bool check(string a)
{
    int lena = a.size();
    string b = a;
    a += a;
    for(int i = 0;i < lena; ++i)
        if(a.substr(i,lena) < b) return 0;
    return 1;
}
 
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        cin>>s;
        len = s.size();
        x = 0;
        int t = 0;
        while(x < len)
        {
            n = work(x);
            ++t;
            a[t] = "";
            for(int i = x;i <= n; ++i) a[t] += s[i];
            x = n + 1;
        }
        int tot = 0;
        for(int i = 1;i <= t; ++i)
        {
            int k = i + 1;
            string ans = a[i];
            while(k <= t && a[k] == a[i]) ans += a[k],a[k++] = "";
            b[++tot] = ans;
            i = k - 1;
        }
        for(int i = 1;i <= tot; ++i)
        {
            while(b[i] == "") i++;
            int j = i + 1;
            while(j <= tot && check(b[i] + b[j]))
            {
                b[i] += b[j];
                b[j] = "";
                j++;
            }
            i = j - 1;
        }
        bool flag = 0;
        for(int i = 1;i <= tot; ++i)
            if(b[i] != "")
            {
                if(flag) printf(" "); flag = 1;
                cout<<b[i];
            }
        printf("\n");
    }
    return 0;
}
/**
1110001110011100111100111000111
0001110001110011
*/

问题虫洞——B:https://ac.nowcoder.com/acm/contest/887/B


黑洞内窥:

求一个n次方多项式能不能因式分解。。。。(n<=20)

思维光年:

首先,题目没有说可以是实数因式。。。。

所以,问题就变成了:n次方多项式有没有零点。。。

因为我们知道:对于一个多项式来说,如果它存在零点的话,则其总能写出(x - x0) *( ......)  [其中x0为零点]   的形式,

而我们知道,二次函数是可能不存在零点的(b^2 - 4*a*c < 0) ,

而其它n次方多项式在求导之后,其导函数的图像就是(n-1)次方的多项式的图像。。。

固,只有出现二次函数的<0 时不会出现零点,,,

特判一下,ac~~~~~

ACcode:

#include<bits/stdc++.h>
using namespace std;
 
int T,n;
int x[30],a,b,c;
 
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i = 0;i <= n; ++i) scanf("%d",&x[n - i]);
        if(n < 2) printf("Yes\n");
        else if(n > 2) printf("No\n");
        else
        {
            a = x[2]; b = x[1]; c = x[0];
            if(b * b - 4 * a * c < 0) printf("Yes\n");
            else printf("No\n");
        }
    }
    return 0;
}