牛客编程巅峰赛S1赛季第1场 - 青铜&白银局

比赛链接
**

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];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值