牛客编程巅峰赛S2第1场

牛牛组数

高精度

题目描述

牛牛现在有一个长度为n的只包含数字1-9的字符串x,牛牛想用这n个数字组成k个数。这k个数每个数至少要用字符串x中的一个数字,字符串x中的每个位置的字符要在这k个数中出现一次。牛牛想知道这k个数的和最大是多少。

组成数字的定义如下:

比如n=3的字符串x为“121”

如果k=3,那么组成k个数只有{1,1,2}这一种可能,和只有一种可能为4

如果k=2,那么组成k个数的方案有{11,2},{12,1},{21,1}三种可能,和最大为21+1=22

如果k=1,那么组成k个数的方案有{112},{121},{211}三种可能,和最大为211

示例1
输入

“345”,2

返回值

“57”

说明

53+4=57,无法得到比57更大的和

示例2
输入

“233333”,3

返回值

“3338”

说明

3332+3+3=3338,无法得到比3338更大的和

示例3
输入

“111222333444555666777888999”,1

返回值

“999888777666555444333222111”

说明

无法得到比999888777666555444333222111更大的和

备注:

对于百分之100的数据:;1≤n≤100000;1≤k≤n; (注意给的字符串和返回的字符串都不带引号)

ac代码:
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回最大和的字符串
     * @param x string字符串 即题目描述中所给字符串
     * @param k int整型 即题目描述中所给的k
     * @return string字符串
     */
    string Maxsumforknumers(string x, int k) {
        // write code here
        //cout<<x.length()<<endl;
        int tong[10]={0},a[100005];
        for(int i=0;i<x.length();i++){
            tong[x[i]-'0']++;
        }
        int p = 9;
        for(int i=x.length()-k;i>=0;i--){
            while(tong[p]==0) p--;
            a[i] = p;
            tong[p]--;
        }
        for(;p>=0;p--){      
            a[0] += p*tong[p];
        }
        for(int i=0;i<=x.length();i++){
            a[i+1] += a[i]/10;
            a[i] %= 10;
        }
        /*for(int i = 0;i<x.length()-k+2;i++){
            cout<<a[i]<<" ";
        }
        cout<<"....."<<endl;*/
        string s = "";
        for(int i=x.length();i>=0;i--){
            if(a[i]!=0){
                for(int j=i;j>=0;j--){
                    s += a[j]+'0';
                }
                break;
            }
        }
        return s;
    }
};

代码2

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回最大和的字符串
     * @param x string字符串 即题目描述中所给字符串
     * @param k int整型 即题目描述中所给的k
     * @return string字符串
     */ 
    int a[100005]={0};
    int tong[10];
    string Maxsumforknumers(string x, int k) {
        // write code here
        int i;
        for(i=0;i<x.length();i++){
            tong[x[i]-'0']++;
        }
        int p=9;
        for(i=x.length()-k;i>=0;i--){
            while(!tong[p]) p--;
            a[i]=p;
            tong[p]--;
        }
        for(;p>0;p--){
            a[0] += p*tong[p];
        }
        for(i=0;i<x.length();i++){
            a[i+1]+=a[i]/10;
            a[i]%=10;
        }
        for(i=x.length();i>=0;i--) {
            if(a[i]!=0)
                break;
        }
        string res="";
        for(;i>=0;i--) res += a[i]+'0';

        return res;
              
    }
};

最小差值

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 求最小差值
     * @param a int整型vector 数组a
     * @return int整型
     */
    int minDifference(vector<int>& a) {
        // write code here
        sort(a.begin(),a.end());
        //int minn = (1 << 31)-1;
        long long c,d,minn = 1e18;
        for(int i=0;i<a.size()-1;i++){
        	//必须要转long long 才能过
            //minn = min((long long)minn , (long long)a[i+1]-a[i]);
            c = a[i];
            d = a[i+1];
            minn = min(minn, d-c);
        }
       
        return minn;
    }
};

Tree IV

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param n long长整型 表示标准完全二叉树的结点个数
     * @return long长整型
     */
    long long tree4(long long n) {
        // write code here
        int mod = 998244353;
        long long i,res=0,dep=1;
        for(i=1;i*2<=n;i*=2){
            long long sum = (i+2*i-1)*i/2%mod;
            res = (res+sum*dep)%mod;
            dep++;
        }
        long long sum = (i+n)*(n-i+1)/2%mod;
        res = (res+sum*dep)%mod;
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值