牛客编程巅峰赛S2赛季第一场初级场题解与参考代码

第一题 最小差值:
考察基本语法,简单二重循环模拟即可
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 求最小差值
     * @param a int整型vector 数组a
     * @return int整型
     */
    int minDifference(vector<int>& a) {
        int ans=abs(a[0]-a[1]);
        for(int i=0;i<a.size();++i)
            for(int j=i+1;j<a.size();++j){
                int te=abs(a[i]-a[j]);
                if (te<ans) ans=te;
            }
         return ans;
    }
};

第二题 Tree IV:
可以枚举层数,计算出这层点的开始点编号与结束点编号,统计这层点的答案。
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param n long长整型 表示标准完全二叉树的结点个数
     * @return long长整型
     */
    static const int p=998244353;
    long long tree4(long long n) {
        // write code here
        long long ans=0;
        for(long long i=1,l=1,r=1;l<=n;++i,l=l*2,r=r*2+1){
            long long t=r;
            if (n<t) t=n;
            ans+=((l+t)*(t-l+1)/2)%p*i%p;
        }
        ans%=p;
        return ans;
    }
};

第三题 牛牛组数:
一开始用python3写的,结果TLE。。。还是老老实实用C++写了
用贪心思想发现,如果将数字分为k-1个1位的数,和1个n-k+1位的数,并且这个n-k+1位的数的各个数位从高位到低位数码是从大到小排列的,则k个数相加得到的结果将是最大的(因为数码较大的数会得到尽可能高的权重)。由于数字的长度比较大,所以写点简单的高精度处理即可。
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回最大和的字符串
     * @param x string字符串 即题目描述中所给字符串
     * @param k int整型 即题目描述中所给的k
     * @return string字符串
     */
    int d[10],a[110000];
    string ans;
    string Maxsumforknumers(string x, int k) {
        // write code here
        int n=x.length();
        for(int i=0;i<10;++i) d[i]=0;
        for(int i=0;i<n;++i) d[x[i]-'0']++;
        for(int i=1;i<=n+10;++i) a[i]=0;
        int j=9,l=n-k+1;
        for(int i=l;i>=1;--i){
            while (d[j]==0)
                --j;
            --d[j];
            a[i]=j;
        }
        for(int i=1;i<k;++i){
            while (d[j]==0)
                --j;
            --d[j];
            a[1]+=j;
        }
        for(int i=1;i<=l;++i)
            if (a[i]>9){
                a[i+1]+=a[i]/10;
                a[i]%=10;
            }
        while (a[l+1]){
            ++l;
            if (a[l]>9){
                a[l+1]+=a[l]/10;
                a[l]%=10;
            }
        }
        ans="";
        for(int i=l;i>=1;--i) ans+=(char)(a[i]+'0');//ans+=!!!!!!!
        return ans;
    }
};



全部评论

相关推荐

10-06 12:46
门头沟学院 Java
跨考小白:定时任务启动
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务