牛客周赛 Round 10

A.游游的最长稳定子数组

原题链接 : 

登录—专业IT笔试面试备考平台_牛客网

思路 : 

一个线性dp,dp[i]表示以a[i]结尾的最长稳定子数组的长度;

dp方程 : 

        if(abs(a[i]-a[i-1]) <= 1) dp[i]=dp[i-1]+1;
        else dp[i] = 1;

代码 : 

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'

using namespace std;
typedef long long LL;
int gcd(int a,int b){ return b==0 ? a : gcd(b,a%b); }
int lcm(int a,int b){ if(a==0||b==0) return 0; return (a*b)/gcd(a,b); }
bool is_prime(int x){if(x<2) return false;
for(int i=2;i<=x/i;i++) if(x%i==0) return false; return true;}
//numbers.erase(std::unique(numbers.begin(), numbers.end()), numbers.end()); // 去重操作
const int N = 1e5+10;
int a[N];
int dp[N];

inline void solve(){
    int n ; cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    dp[1] = 1;
    for(int i=2;i<=n;i++){
        if(abs(a[i]-a[i-1]) <= 1) dp[i]=dp[i-1]+1;
        else dp[i] = 1;
    }
    int ma = 0;
    for(int i=1;i<=n;i++){
        ma = max(ma,dp[i]);
    }
    cout<<ma<<endl;
    return ;
}
 
int main()
{
    IOS
    int _;
    // cin >> _;
    _ = 1; 
    while(_ --) solve();
    return 0;
}

B.游游的字符重排

原题链接 : 

登录—专业IT笔试面试备考平台_牛客网

思路 : 

  1. 写一个判断函数pd()判断字符串s是不是一个好串;

  2. 对字符串s的全排列中的每个字符串,进行判断,pd(s )为true,则ans++;

  3. 可以用next_permutation来实现全排列(可以记住);

代码 : 

#include<bits/stdc++.h>
using namespace std;
string s;int n;
int ans = 0;
bool pd(string s){
    for(int i=1;i<s.size();i++) if(s[i] == s[i-1]) return false;
    return true;
}
int main(){
    cin>>s ; n=s.size();
    sort(s.begin(),s.end());
    do{
        if(pd(s)) ans ++;
    }while(next_permutation(s.begin(),s.end()));
    cout<<ans<<endl;
}

游游开车出游

原题链接 : 

登录—专业IT笔试面试备考平台_牛客网

思路 : 

所以 : 分v^2>xy和v^2<=xy两种情况即可!

详情请看代码 : 

代码 : 

#include <bits/stdc++.h>
using namespace std;
long double v,x,y;
int main() {
    cin >> v >> x >> y;
    if(pow(v,2) > x*y ) printf("%.7llf",y/v);
    else printf("%.7llf",2*sqrt(y/x) - v/x);
}

 注意 : 

  1. 变量类型要用long double 来定义
  2. 1e-6保留7位小数即可

游游的回文子串

原题链接 : 

登录—专业IT笔试面试备考平台_牛客网

思路 : 

  1. 首先对于第 i 个串中的回文子串进行记录,那么对于一个长度为a[i]的相同字符串,其回文串的数量是1+2+3+...+a[i],也就是(1+a[i])*a[i]/2;
  2. 然后再判断是否存在i串与相邻两串形成回文串的可能,令l=i-1,r=i+1 ; 如果a[l]!=a[r],回文串的数量为min(a[l] , a[r]);如果相等,加上a[l]或a[r],然后l--,r++即可;

详情请看代码 : 

代码 :

#include<bits/stdc++.h>
using namespace std;
const int N = 1007,MOD = 1e9+7;
typedef long long LL;
LL n,a[N];
int main(){
    scanf("%lld",&n);
    LL ans = 0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        ans = ( ans + (1+a[i])*a[i]/2) % MOD;
    }
    for(int i=2;i<n;i++){
        int l = i-1,r=i+1;
        while(l>=1&&r<=n){
            ans=(ans+min(a[l],a[r]) ) % MOD;
            if(a[l] != a[r]) break;
            l--;
            r++;
        }
    }
    cout<<ans;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值