A 最小差值

https://ac.nowcoder.com/acm/contest/9004/A

解题思路:排个序再比较差值找到最小差值即可,但最坑的地方就是差值可能太大超出了整型范围而变成负数最后输出了

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 求最小差值
     * @param a int整型vector 数组a
     * @return int整型
     */
    int minDifference(vector<int>& a) {
        // write code here
        vector<int>b;
        for(int i=0;i<a.size();++i)
            b.push_back(a[i]);
        int n=a.size();
        long long ans=INT_MAX;
        sort(b.begin(),b.begin()+n,less<int>());
        for(int i=1;i<n;++i){
            ans=min(ans,1LL*abs(1LL*b[i]-1LL*b[i-1]));
        }
        return (int)ans;
    }
};

B Tree IV

解题思路:最后一层前面的是满二叉树,由满二叉树的结构可以发现,最左边的结点都是上一层最左边的结点的2倍,而且每层结点j的个数和最左边的结点数值相同,由于每层结点数值连续,则可以用s=(i+2*i-1)*i/2%mod;求出每层的结点数之和,注意要先除2再取余,否则可能会改变精度导致答案错误,节点数和乘上各层深度相加再取余,再将最后一层的结点数求出并乘上深度相加取余即可。
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param n long长整型 表示标准完全二叉树的结点个数
     * @return long长整型
     */
    long long tree4(long long n) {
        // write code here
        long long mod=998244353,i,res=0,dep=1,s;
        for(i=1;i*2<=n;i*=2)//只看最左边的结点
        {
            s=(i+2*i-1)*i/2%mod;
            res=(res+s*dep)%mod;
            dep++;
        }
        s=(i+n)*(n-i+1)/2%mod;//最后一层
        res=(res+s*dep)%mod;
        return res;
    }
};

C 牛牛组数

解题思路:首先写几个例子可以看出:
k=1时字符从大到小排列即可;k>=2时留下k-1个数(数字字符中相对较小的)作为个位数,剩下的字符按数字字符从大到小组成一个最大的数,那么这样求得的和最大(每个数字字符都要全部用完);
注意转换为字符串输出前需要在最后加上'\0'
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回最大和的字符串
     * @param x string字符串 即题目描述中所给字符串
     * @param k int整型 即题目描述中所给的k
     * @return string字符串
     */
    int tong[10],a[100010]={0};
    string Maxsumforknumers(string x, int k) {
        // write code here
        for(int i=0;i<x.size();++i)
            tong[x[i]-'0']++;
        int f=9,i;//将k个数字分成k-1个个位数和一个x.size()-k+1位的数
        for(i=x.size()-k;i>=0;--i)
        {
            while(!tong[f])f--;//找到存在的最大数
            a[i]=f;
            tong[f]--;//使用了一个f
        }
        for(;f>0;f--)//处理剩下未使用的字符
        {
            a[0]+=f*tong[f];//将剩下充当个位数的先加在a[0]位上
        }
        for(i=0;i<x.size();i++)
        {
            a[i+1]+=a[i]/10;
            a[i]=a[i]%10;//将刚才加上去的个位数超过10的部分分到高位上
        }
        for(i=x.size();i>=0;--i)//可能有进位到第x.size()位的
            if(a[i]!=0)break;//找到第一位不是0的位数
        string s="";//将得到的数转换为string类型输出
        for(;i>=0;--i)s+=a[i]+'0';
        s+='\0';
        return s;
    }
};