牛客周赛 Round 10【题解完成】

14 阅读2分钟
题目难度知识点
A 游游的最长稳定子数组双指针
B 游游的字符重排全排列
C 游游开车出游三分
D 游游的回文子串★★双指针

image.png C题不会,不会数学忘完了,但是其实容易分析出来可以用数学求极值点,但是还可以用三分搞。 D题也不会,其实比较简单,双指针搞一下就行了。C题三分没学不会情有可原,D题不会有点拉胯。太菜了呀。。呜呜呜呜

游游的最长稳定子数组

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
typedef long long int LL;
LL a[N],n,ans;
int main(void)
{
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    for(int i=0;i<n;i++)
    {
        int j=i;
        while(j+1<n&& abs(a[j+1]-a[j])<=1) j++;
        ans=max(ans,1ll*j-i+1);
        i=j;
    }
    cout<<ans;
    return 0;
}

游游的字符重排

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
typedef long long int LL;
string s;
int ans=0;
int main(void)
{
    cin>>s;
    sort(s.begin(),s.end());
    do
    {
        int flag=1;
        for(int i=1;i<s.size()-1;i++)
        {
            if(s[i]==s[i-1]) flag=0;
            if(s[i]==s[i+1]) flag=0;
        }
        ans+=flag;
    }while(next_permutation(s.begin(),s.end()));
    cout<<ans;
    return 0;
}

游游开车出游

image.png

#include<bits/stdc++.h>
using namespace std;
double v0,x,y;
double check(double t)
{
    return y/(v0+x*t)+t;
}
int main(void)
{
    cin>>v0>>x>>y;
    double l=0,r=1e9;
    while(r-l>1e-9)
    {
        double mid1=l+(r-l)/3;
        double mid2=r-(r-l)/3;
        if(check(mid1)>check(mid2)) l=mid1;
        else r=mid2;
    }
    printf("%.7lf",check(l));
    return 0;
}

游游的回文子串

image.png 分两种情况:

  • 同一个区域, 长度为n, 方案数n*(n+1)/2,例如,111 可以形成 1111111111 共 6 个回文子串
  • 以某个区域为中心,往两边扩展,则线性增长
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
const int mod=1e9+7;
typedef long long int LL;
LL a[N],n,ans;
int main(void)
{
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    for(int i=0;i<n;i++)
    {
        ans=(ans+(__int128)a[i]*(a[i]+1)/2)%mod;//这个区域的回文串个数
        for(int j=1;i+j<n&&i-j>=0;j++)//以该区间为中心,向外扩展
        {
            if(a[i-j]==a[i+j]) ans=(ans+a[i-j])%mod;//对称相等,继续扩展
            else{//不相等,加上相等的那一部分退出
                ans=(ans+min(a[i-j],a[i+j]))%mod;
                break;
            }
        }
    }
    cout<<ans;
    return 0;
}