牛客编程巅峰赛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:牛妹的野菜
不会…