牛客编程巅峰赛S1第4场 - 黄金&钻石(总结)

牛客编程巅峰赛S1第4场 - 黄金&钻石(总结)

自闭场,有点怀疑这两年大学刷的题都是白刷了…

A:牛牛分蛋糕

题意

牛牛有n个盘子,两种类型的蛋糕,数量分别为:a,b。
有如下规则:
1.一个盘子只能有一种类型的蛋糕
2.每个盘子都必须有蛋糕
3.蛋糕数量最少的那个盘子要使它的数量尽可能大(也就是使每个盘子数量尽可能平均)

题解

人傻了,这不是很明显的二分答案就可以嘛,偏偏要找规律,找了好久还没找到…

AC代码(cpp):

class Solution {
public:
    /**
     * 处理函数,返回在所有分法中,蛋糕数量最少的盘子中分到最多的蛋糕数量
     * @param n int整型 n个盘子
     * @param a int整型 a蛋糕数量
     * @param b int整型 b蛋糕数量
     * @return int整型
     */
    int solve(int n, int a, int b) {
        // write code here
        int l=1,r=min(a,b);
        while(l<=r){
            int mid=(l+r)/2;
            int num=a/mid+b/mid;
            if(num>=n){
                l=mid+1;
            }
            else{
                r=mid-1;
            }
        }
        return l-1;
    }
};

B:牛牛凑数字

题意

9个数字分别为1-9,每个数字对应相应的价格,牛牛有n单位的money,问最大能构成多大的数字

题解

看不懂,想不明白,真佩服三分钟能A的大佬们。。。
首先遍历价格数组,找出价格最少的数字,如果价格最少的数字都买不起,则直接返回"-1";
否则,可以先求出最终结果的位数为:n/minvalue。
于是每次贪心选择目前能买的最大的数字,不断求出答案。

AC代码(cpp):

class Solution {
public:
    /**
     * 得到牛牛能够凑到的最大的数字
     * @param n int整型 牛牛能够承受的价格
     * @param a int整型vector 1-9这九个数字的价格数组
     * @return string字符串
     */
    string solve(int n, vector<int>& a) {
        // write code here
        int minvalue=a[0];
        for(int i=1;i<=9;i++){
            minvalue=min(minvalue,a[i-1]);
        }
        int d=n/minvalue;  //表示最终结果的位数
        if(d==0){
            return "-1";
        }
        int now=0;   //表示当前的位数
        string ans="";
        for(int i=9;i>=1;i--){//从大的数字开始选
            while(n-a[i-1]>=minvalue*(d-now-1)){
                ans+=(i+'0');
                now++;
                n-=a[i-1];
                if(now==d) break;
            }
            if(now==d) break;
        }
        return ans;
    }
};

C:牛妹的野菜

不会…

猜你喜欢

转载自blog.csdn.net/boliu147258/article/details/107436521