A、牛牛分蛋糕

题目描述
牛牛今天家里要来客人,所以牛牛今天特意做了他最拿手的两种蛋糕,但是他是一个有洁癖的人,所以他在分蛋糕时,有如下几个原则:
1.他不希望一个盘子里出现两种蛋糕
2.他希望每个盘子中都有蛋糕
3.他想让装有最少蛋糕数量的盘子中装有的蛋糕数量尽可能多

示例1
输入
5,2,3
输出
1
示例2
输入
4,7,10
输出
3

solution



class Solution {
public:
    /**
     * 处理函数,返回在所有分法中,蛋糕数量最少的盘子中分到最多的蛋糕数量
     * @param n int整型 n个盘子
     * @param a int整型 a蛋糕数量
     * @param b int整型 b蛋糕数量
     * @return int整型
     */

    bool check(int x, int n, int a, int b) {
    int cnt1 = a / x;
    int cnt2 = b / x;
    return cnt1 + cnt2 >= n;
}

int solve(int n, int a, int b) {
    // write code here
    int l = 1, r = 1e9, ans = -1;
    while (l <= r) {
        int mid = r + l >> 1;
        if (check(mid, n, a, b))    l = mid + 1, ans = mid;
        else r = mid - 1;
    }
    return ans;
}
};

B、牛牛凑数字

题目描述
牛牛今天逛商店,看到商店里摆着一些很漂亮的数字,牛牛非常喜欢,想买一些数字带回家。
数字一共有九种类型,分别是1-9这九个数字,每个数字的价钱都不一样,而且每个数字的货源都非常充足。
牛牛是个完美主义者,他希望用自己的能够承受的价格,从这些数字里面购买,并且凑到最大的数字带回家。

示例1
输入
5,[5,4,3,2,1,2,3,4,5]
输出
"55555"
示例2
输入
2,[9,11,1,12,5,8,9,10,6]
输出
"33"

solution




class Solution {
public:
    /**
     * 得到牛牛能够凑到的最大的数字
     * @param n int整型 牛牛能够承受的价格
     * @param a int整型vector 1-9这九个数字的价格数组
     * @return string字符串
     */
    struct node{
        int val,i;
        bool operator < (const node A)const{
            if(val == A.val) return i > A.i;
            return val < A.val;
        }
    }q[10];
    string solve(int n, vector<int>& a) {
        // write code here
        for(int i = 0 ; i < 9 ; ++i){
            q[i].val = a[i];
            q[i].i = i+1;
        }
        sort(q,q+9);
        string ans = "";
        int len = n/q[0].val;
        n -= len*q[0].val;
        int qvq = q[0].i,val = q[0].val;
        for(int i = 0 ; i < len ; ++i) ans +=char(qvq+'0');
        int j = 0;
        for(int i = 8 ; i >= qvq ; --i){
            while(n + val >= a[i] && j < len){
                  ans[j++] = i + '1';
                  n = n + val - a[i];
            }
        }
        if(ans.size() == 0) ans = "-1";
        return ans;
    }
};