牛客编程巅峰赛S2赛季(高级场第7场)考题参考代码(非官方)

牛牛的特殊子序列

int i,n;
int sum[1000005];
vector < int > a , c;
class Solution {
public:
    /**
     *
     * @param x string字符串
     * @return int整型
     */
    int Maximumlength(string x) {
       n=x.size();
        for(i=0;i<n;i++)
        {
            if(i!=0)sum[i]=sum[i-1];
            if(x[i]== 'a' )a.push_back(i);
            else if(x[i] =='c')c.push_back(i);
            else if(x[i] =='b' )sum[i]++;
        }
        reverse(c.begin(),c.end());
        int pos=0;
        for(i=0;i<a.size()&&i<c.size();i++)
        {
            if(c[i]<a[i])break;
            if(sum[c[i]]-sum[a[i]]<i+1)break;
            pos++;
        }
        return 3*pos;
    }
};


分贝壳游戏

class Solution {
public:
    /**
     *
     * @param n int整型
     * @param p int整型
     * @param q int整型
     * @return int整型
     */
    int Gameresults(int n, int p, int q) {
        // write code here
        int ans;
        if(p>q)ans=1;
        else if(q>p)
        {
            if(p>=n)ans=1;
            else ans=-1;
        }
        else
        {
            if(n%(p+1))ans=1;
            else ans=-1;
        }
        return ans;
    }
};


经过直径的点

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param n int整型 节点个数
     * @param u int整型vector
     * @param v int整型vector
     * @return int整型
     */
    int dp[100005][3],mx,ans;
    vector<int>edge[100005];
    void dfs(int x,int fa) {
        for(int i = 0;i<(int)edge[x].size();i++) {
            int y = edge[x][i];
            if(y == fa) continue;
            dfs(y,x);
            if(dp[y][0] + 1 > dp[x][0]) {
                dp[x][1] = dp[x][0];
                dp[x][0] = dp[y][0] + 1;
            } else {
                dp[x][1] = max(dp[x][1],dp[y][0] + 1);
            }
        }
    }
    void dfs1(int x,int fa) {
        for(int i = 0;i<(int)edge[x].size();i++) {
            int y = edge[x][i];
            if(y == fa) continue;
            if (1 + dp[y][0]==dp[x][0]){
                dp[y][2] = max(dp[y][2],dp[x][1] + 1);
            }
            else {
                dp[y][2] = max(dp[y][2],dp[x][0] + 1);
            }
            dp[y][2] = max(dp[y][2],dp[x][2] + 1);
            dfs1(y,x);
        }
    }
    int PointsOnDiameter(int n, vector<int>& u, vector<int>& v) {
        // write code here
        memset(dp,0,sizeof(dp));
        for(int i = 0;i<n-1;i++) {
            edge[u[i]].push_back(v[i]);
            edge[v[i]].push_back(u[i]);
        }
        dfs(1,0);
        dfs1(1,0);
        for(int i =1;i<=n;i++) {
            mx = max(mx,dp[i][0] + dp[i][2]);
            mx = max(mx,dp[i][0] + dp[i][1]);
        }
        for(int i = 1;i<=n;i++) {
            if(dp[i][0] + dp[i][2] == mx || dp[i][0] + dp[i][1] == mx) {
                ans++;
            }
        }
        return ans;
    }
};


全部评论

相关推荐

09-11 03:07
已编辑
湖南大学 Java
Lemon2ee:上海,nlp,985,博士,哪怕少一个我都觉得这是假的
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务