牛客编程巅峰赛S1赛季第1场 - 青铜&白银局【题解完结】

95 阅读1分钟

#移动字母【模拟】

image.png

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

魔法数字【bfs】

image.png

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 表示牛牛的数字
     * @param m int整型 表示牛妹的数字
     * @return int整型
     */
    int bfs(int n,int m)
    {
        int a[20100]={0};
        memset(a,-1,sizeof a);
        a[n]=0;
        queue<int>q; q.push(n);
        while(q.size())
        {
            int u=q.front(); q.pop();
            //cout<<u<<endl;
            if(u==m)
            {
                return a[u];
            }
            if(a[u-1]==-1 && u-1>=-1e4)
            {
                q.push(u-1);
                a[u-1]=a[u]+1;
            }
            if(a[u+1]==-1 && u+1<= 1e4)
            {
                q.push(u+1);
                a[u+1]=a[u]+1;
            }
            if(a[u*u]  ==-1 && u*u<=1e4)
            {
                q.push(u*u);
                a[u*u]=a[u]+1;
            }
        }
        return -1;
    }
    int solve(int n, int m) {
        // write code here
        int t=bfs(n,m);
        return t;
    }
};

牛妹的春游【变种0/1背包】

image.png

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