牛客小白月赛13

2023-01-08,

闲的蛋疼打了一场小白,然后被爆踩。。。

J题好难啊,要学了莫反才能做,先留坑吧

先放一发官方题解

 

小A的签到题

链接:https://ac.nowcoder.com/acm/contest/549/A
来源:牛客网

题目描述

这是一道签到题,主要考验比赛时的手速。
接下来是一段很简单的代码,或许你提交它就可以AC。

#include<bits/stdc++.h>
using namespace std;
int main() {
    long long n;
    scanf("%lld",&n);
    long long f1=1,f2=1,f3;
    for(int i=3;i<=n;i++) {
        f3=f1+f2;
        f1=f2;
        f2=f3;
    }
    printf("%lld\n",f3*f3-f1*f1-f1*f3);
    return 0;
}

输入描述:

一行一个整数N

输出描述:

一行一个整数表示结果

示例1

输入

3

输出

1

备注:

3N1e11
sol:XJB找找规律发现奇数是1,偶数是-1
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
    ll s=0;
    bool f=0;
    char ch=' ';
    while(!isdigit(ch))
    {
        f|=(ch=='-'); ch=getchar();
    }
    while(isdigit(ch))
    {
        s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
    }
    return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
    if(x<0)
    {
        putchar('-'); x=-x;
    }
    if(x<10)
    {
        putchar(x+'0');    return;
    }
    write(x/10);
    putchar((x%10)+'0');
    return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
ll n;
int main()
{
    R(n);
    if(n&1) puts("1"); else puts("-1");
    return 0;
}

View Code


 

链接:https://ac.nowcoder.com/acm/contest/549/B
来源:牛客网

小A的回文串


时间限制:C/C++ 2秒,其他语言4秒

空间限制:C/C++ 262144K,其他语言524288K


64bit IO Format: %lld

题目描述

小A非常喜欢回文串,当然我们都知道回文串这种情况是非常特殊的。所以小A只想知道给定的一个字符串的最大回文子串是多少,但是小A对这个结果并不是非常满意。现在小A可以对这个字符串做一些改动,他可以把这个字符串最前面的某一段连续的字符(不改变顺序)移动到原先字符串的末尾。那么请问小A通过这样的操作之后(也可以选择不移动)能够得到最大回文子串的长度是多少。

输入描述:

一行一个字符串表示给定的字符串S

输出描述:

一行输出一个整数,表示通过这样的操作后可以得到最大回文子串的长度。

示例1

输入

复制

dcbaabc

输出

复制

7

说明

将前面的dcba移动到末尾变成abcdcba,这个字符串的最大回文子串就是它本身,长度为7

备注:

N1N5000

sol:直接枚举断点,然后移过去,在之后马拉车可以n2过掉此题,但是我忘了马拉车怎么写,然后其实根本不用马拉车,把整个字符串复制一遍,粘在末尾,找到整个字符串的最长回文串就是答案了
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
    ll s=0;
    bool f=0;
    char ch=' ';
    while(!isdigit(ch))
    {
        f|=(ch=='-'); ch=getchar();
    }
    while(isdigit(ch))
    {
        s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
    }
    return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
    if(x<0)
    {
        putchar('-'); x=-x;
    }
    if(x<10)
    {
        putchar(x+'0');    return;
    }
    write(x/10);
    putchar((x%10)+'0');
    return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=5005;
int n;
char S[N<<1];
int main()
{
    int i,l,r,ans=0;
    scanf("%s",S+1);
    n=strlen(S+1);
    for(i=1;i<=n;i++) S[i+n]=S[i];
    for(i=1;i<=2*n;i++)
    {
        l=i; r=i;
        while(S[l]==S[r]&&l>=1&&r<=2*n&&r-l+1<=n) l--,r++;
        ans=max(ans,r-l+1-2);
        l=i,r=i+1;
        while(S[l]==S[r]&&l>=1&&r<=2*n&&r-l+1<=n) l--,r++;
        ans=max(ans,r-l+1-2);
    }
    Wl(ans);
    return 0;
}
/*
input
dcbaabc
output
7
*/

View Code


 

 

 

链接:https://ac.nowcoder.com/acm/contest/549/C
来源:牛客网

小A买彩票


时间限制:C/C++ 1秒,其他语言2秒


空间限制:C/C++ 262144K,其他语言524288K


64bit IO Format: %lld

题目描述

小A最近开始沉迷买彩票,并且希望能够通过买彩票发家致富。已知购买一张彩票需要3元,而彩票中奖的金额分别为1,2,3,4元,并且比较独特的是这个彩票中奖的各种金额都是等可能的。现在小A连续购买了n张彩票,他希望你能够告诉他至少能够不亏本的概率是多少。

输入描述:

一行一个整数N,为小A购买的彩票数量

输出描述:

输出一个最简分数a/b,表示小A不亏本的概率。若概率为1,则输出1/1,概率为0,则输出0/1。

示例1

输入

复制

2

输出

复制

3/8

备注:

30

sol:dp随便搞搞,dp[i][j]表示买了i张彩票,一共得了j元钱,转移十分水

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
    ll s=0;
    bool f=0;
    char ch=' ';
    while(!isdigit(ch))
    {
        f|=(ch=='-'); ch=getchar();
    }
    while(isdigit(ch))
    {
        s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
    }
    return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
    if(x<0)
    {
        putchar('-'); x=-x;
    }
    if(x<10)
    {
        putchar(x+'0');    return;
    }
    write(x/10);
    putchar((x%10)+'0');
    return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=35;
int n;
ll dp[N][N<<2];
inline ll gcd(ll a,ll b)
{
    return (!b)?(a):(gcd(b,a%b));
}
int main()
{
    int i,j,k;
    R(n);
    dp[0][0]=1;
    for(i=0;i<n;i++)
    {
        for(j=i;j<=(i<<2);j++)
        {
            for(k=1;k<=4;k++) dp[i+1][j+k]+=dp[i][j];
        }
    }
    ll Fz=0,Fm;
    for(i=((n<<1)+n);i<=(n<<2);i++) Fz+=dp[n][i];
    Fm=1ll<<(n<<1);
    ll GG=gcd(Fz,Fm);
    write(Fz/GG); putchar('/'); Wl(Fm/GG);
    return 0;
}
/*
input
2
output
3/8
*/

View Code