牛客编程巅峰赛S1赛季第1场 - 青铜&白银局 A.字符串水题 B.bfs C.二维付费背包问题

链接:https://ac.nowcoder.com/acm/contest/6218/A
来源:牛客网

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

示例1
输入
复制
“abcavv”
输出
复制
“bcvvaa”

class Solution {
public:
    /**
     * 
     * @param s string字符串 
     * @return string字符串
     */
    string change(string s) {
         string s2="";
  int ans=0;
  for(int i=0;i<s.size();i++){
      if(s[i]=='a')ans++;
      else s2+=s[i];
  }
  for(int i=0;i<ans;i++){
      s2+='a';
  }
        return s2;
    }
};

B
链接:https://ac.nowcoder.com/acm/contest/6218/B
来源:牛客网

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

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

输出:
返回最少需要的操作数。
示例1
输入
复制
3,10
输出
复制
2

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

链接:https://ac.nowcoder.com/acm/contest/6218/C
来源:牛客网

题目描述
众所周知,牛妹要组织公司的出游。要准备面包和饮料。她买到的面包和饮料都是捆绑销售的,也就是说,一个大包装里面x个面包+y个饮料,花费t元。
为了满足公司的要求,需要一定数量的面包和饮料。
你的任务就是帮助牛妹计算,为了满足公司需要,一共最少花费多少钱。
示例1
输入
复制
5,60,[[3,36,120],[10,25,129],[5,50,250],[1,45,130],[4,20,119]]
输出
复制
249
备注:
每种大包装只能最多买一个,所需面包breadNum、饮料的总量beverageNum均不超过2000
牛妹一定能找到满足要求的方案让大家能够出游。

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

你可能感兴趣的:(牛客)