牛客算法周周练14

最近复习了一些算法,准备打场比赛找一下不会的。
写的是第一题
B
简单猜想了一下,发现相邻的两个数一定是互质的所以最大就是n个

题目描述 现在我们要把1\ldots n1…n这n个数字首尾连接组成一个环,使得相邻元素互质的对数尽可能多。请输出最大对数。
输入描述: 一行一个整数n(1≤ n≤ 1000)。
输出描述: 一行一个整数表示答案在这里插入代码片

#include
#include
using namespace std;

int main()
{
    int n;
    cin>>n;
    cout<<n<<endl;
    return 0;
}

E
给了一个字符串,寻找前缀后缀,并中间出现过的最长字符串,并且保证存在。我写的比较麻烦。

帕秋莉掌握了一种水属性魔法
这种魔法可以净化黑暗
帕秋莉发现对于一个黑暗的咒语s,可以使用这个水元素魔法净化它,净化的咒语是一个最长的字符串t,t满足以下条件:
它是s的前缀
它是s的后缀
除前缀和后缀外,它还在s中出现过至少一次
既然你都学会了,那么净化的工作就交给你了!
输入描述: 一行字符串 s ,代表黑暗咒语 输出描述: 一个字符串 t ,表示满足条件的最长净化咒语

#include
#include
#include
using namespace std;

int main()
{
    char s[1000000],a[100000],b[100000];
    int flag;
    cin>>s;
    for(int i=strlen(s)*1.0/3;i>=1;i--)
    {
        flag=0;
        memset(a,'\0',sizeof(a));
        memset(b,'\0',sizeof(b));
        strncpy(a,s,i);
        for(int j=0;j<i;j++)
            b[j]=s[strlen(s)-i+j];
        if(strcmp(a,b)==0)
        {
            int l=strlen(s),n=0,k;
            while(l-i*2)
            {
                for(k=0;k<i;k++)
                    if(s[n+k+i]!=a[k])break;
                if(k==i){flag=1;break;}
                n++;
                l--;
            }
        }
        if(flag)break;
    }
    cout<<a<<endl;
    return 0;
}

D
求x,y的最小公倍数,数可能很大,题目数据范围unsigned long long
牛客算法周周练14_第1张图片

#include
#include
using namespace std;
#define ull unsigned long long
ull gy(ull a,ull b)
{
    if(a%b==0)return b;
    return gy(b,a%b);
}
int main()
{
    ull x,y,g;
    int t,i=1;
    cin>>t;
    while(t--)
    {
        cin>>x>>y;
        g=gy(x,y);
        ull b1=x/g,b2=y/g;
        cout<<"Case "<<i++<<": "<<b1*b2*g<<endl;
    }
    return 0;
}

你可能感兴趣的:(暑假)