牛客编程巅峰赛S1赛季第一场


移动字母

移动字母

题目描述

给定一个只包含小写字母的字符串s,牛牛想将这个字符串中的所有’a’字母全部移动到字符串的末尾,而且保证其它字符的相对顺序不变。其中字符串s的长度<=1e6。

输入样例

"abcavv"

输出样例

"bcvvaa

解题思路

从头到尾遍历字符串s,当 s[i]!=‘a’,将串s的内容复制到ans,然后累计’a’的数量,累加到串ans的后面,最后返回结果。

AC代码

class Solution {
public:
    string ans="";
    string change(string s) {
        // write code here
        int len=s.size(),sa=0;
        for(int i=0;i<len;i++)
        {
            if(s[i]=='a') sa++;
            else ans+=s[i];
        }
        for(int i=0;i<sa;i++) ans+='a';
        return ans;
    }
};

魔法数字

魔法数字

题目描述

一天,牛妹找牛牛做一个游戏,牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的。
操作共有三种,如下:
1.在当前数字的基础上加一,如:4转化为5
2.在当前数字的基础上减一,如:4转化为3
3.将当前数字变成它的平方,如:4转化为16
你能帮牛牛解决这个问题吗?

输入

给定n,m,分别表示牛牛和牛妹的数字。

输出

返回最少需要的操作数。

输入样例

3,10

输出样例

2

数据范围

(1 ≤ \leq n,m ≤ \leq 1000)(1≤n,m≤1000)

解题思路

bfs,开个标记数组 vis[],0表示未访问过,1表示访问过。开个 cnt[] 数组记录一下变换次数,当 n 经过 一定次数的变换后等于 m ,返回 cnt[m]。

AC代码

class Solution {
public:
    /**
     * 返回最后要输出的答案
     * @param n int整型 表示牛牛的数字
     * @param m int整型 表示牛妹的数字
     * @return int整型
     */
    int solve(int n, int m) {
        // write code here
        int vis[2007]={0},cnt[2007]={0};
        queue<int>q;
        vis[n]=1;
        q.push(n);
        while(!q.empty())
        {
            int x=q.front();q.pop();
            if(x==m) return cnt[x];
            if(x*x<2*m-n && !vis[x*x])
            {
                q.push(x*x);
                cnt[x*x]=cnt[x]+1;
                vis[x*x]=1;
            }
            if(x+1<2*m-n && !vis[x+1])
            {
                q.push(x+1);
                cnt[x+1]=cnt[x]+1;
                vis[x+1]=1;
            }
            if(x-1>=0 && !vis[x-1])
            {
                q.push(x-1);
                cnt[x-1]=cnt[x]+1;
                vis[x-1]=1;
            }
        }
    }
};

牛妹的春游

牛妹的春游

题目描述

众所周知,牛妹要组织公司的出游。要准备面包和饮料。她买到的面包和饮料都是捆绑销售的,也就是说,一个大包装里面x个面包+y个饮料,花费t元。
为了满足公司的要求,需要一定数量的面包和饮料。
你的任务就是帮助牛妹计算,为了满足公司需要,一共最少花费多少钱。

输入样例

5,60,[[3,36,120],[10,25,129],[5,50,250],[1,45,130],[4,20,119]]

输出样例

249

备注

每种大包装只能最多买一个,所需面包breadNum、饮料的总beverageNum均不超过2000,牛妹一定能找到满足要求的方案让大家能够出游。

解题思路

1.确定状态 dp[i][j]:表示 i 个面包,j瓶饮料的花费。
2.状态转移 dp[i+bread[i]] [j+beverage[j]]=min(dp[i][j]+cost,dp[i+bread[i+[bread[i]] [j+beverage[j]]。

AC代码

class Solution {
public:
    /**
     * @param breadNum int整型 
     * @param beverageNum int整型 
     * @param packageSum int整型vector<vector<>> 每个一维数组中有三个数,依次表示这个包装里面的面包数量、饮料数量、花费
     * @return int整型
     */
    int dp[2007][2007]={0};
    int minCost(int breadNum, int beverageNum, vector<vector<int> >& packageSum) {
        // write code here
        memset(dp,0x3f,sizeof dp);
        int len=packageSum.size();
        dp[0][0]=0;
        for(int i=0;i<len;++i)
            for(int j=breadNum;j>=0;--j)
                for(int k=beverageNum;k>=0;--k)
                {
                    int tx=min(breadNum,j+packageSum[i][0]);
                    int ty=min(beverageNum,k+packageSum[i][1]);
                    dp[tx][ty]=min(dp[tx][ty],dp[j][k]+packageSum[i][2]);
                }
        return dp[breadNum][beverageNum];
    }
};

这场题目不难,适合小白做,但是这种Leetcode这种模式我吐了,emmm

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸愉聊信奥

谢谢亲的支持,我会继续努力啦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值