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; } };