比赛链接
**
B - 魔法数字
**
思路
就采用bfs。
代码
class Solution {
public:
/**
* 返回最后要输出的答案
* @param n int整型 表示牛牛的数字
* @param m int整型 表示牛妹的数字
* @return int整型
*/
int solve(int n, int m) {
int dist[10001];//记录访问到的数字的步数
queue<int>dl;
dl.push(n);
memset(dist,0x3f,sizeof(dist));//赋初始值很大
dist[n]=0;
if (n >= m) return n - m; //就进行减
while(!dl.empty()){
int qd=dl.front();//取数
dl.pop();
if(qd>0&&dist[qd-1]==0x3f3f3f3f){ //如果小于等于0 继续减就会变成负数
//而负数要变成正数就要平方 比直接在一个正数的基础上平方 或者进行加法用的步骤多
dl.push(qd-1);
dist[qd-1]=dist[qd]+1;
if((qd-1)==m) break;
}
if(qd<(2*m-n)&&dist[qd+1]==0x3f3f3f3f){ //因为你大于2*m-n 还不如一开始就一直-1 需要m-n次
dl.push(qd+1);
dist[qd+1]=dist[qd]+1;
if((qd+1)==m) break;
}
if(qd>1&&qd*qd-m<m-qd&&m>qd&&dist[qd*qd]==0x3f3f3f3f){
//qd要大于1 如果小于0就是由正数减成负数 再平方 而上面已经表明qd>0才能进行减 所以不会有负数 如果qd==0||qd==1 那么平方还是本身 会使得n变为0或者1的步数增加 改变了最小步数
dl.push(qd*qd);
dist[qd*qd]=dist[qd]+1;
if(qd*qd==m) break;
}
}
return dist[m];
}
};
## C 牛妹的春游
**题目描述:**
众所周知,牛妹要组织公司的出游。要准备面包和饮料。
她买到的面包和饮料都是捆绑销售的,也就是说,
一个大包装里面x个面包+y个饮料,花费t元。为了满足公司的要求,
需要一定数量的面包和饮料你的任务就是帮助牛妹计算,
为了满足公司需要,一共最少花费多少钱。
**思路:**
在0-1背包的基础下增加了一维
题解:
```cpp
class Solution {
public:
/**
*
* @param breadNum int整型
* @param beverageNum int整型
* @param packageSum int整型vector<vector<>> 每个一维数组中有三个数,依次表示这个包装里面的面包数量、饮料数量、花费
* @return int整型
*/
int minCost(int breadNum, int beverageNum, vector<vector<int> >& packageSum) {
// write code here
int n = packageSum.size();
int dp[2005][2005];
memset(dp, 88, sizeof dp);
dp[0][0] = 0;
for(int i = 0; i < n; i++)
for(int j = breadNum; j >= 0; j--)
for(int k = beverageNum; k >= 0; k--){
int a = min(breadNum, j+packageSum[i][0]);//因为超过了需要的数量 就直接按需要的数量
int b = min(beverageNum, k+packageSum[i][1]);
dp[a][b] = min(dp[a][b], dp[j][k]+packageSum[i][2]);
}
return dp[breadNum][beverageNum];
}
};