牛客编程巅峰赛S1第4场 - 黄金&钻石题解

牛牛分蛋糕

https://ac.nowcoder.com/acm/contest/6384/A

A 牛牛分蛋糕

题解:暴力。要想最少的盘子中蛋糕最多,就要均匀分配最好,设装第一种蛋糕盘子数为,则第二种为,然后暴力枚举即可

class Solution {
public:
    /**
     * 处理函数,返回在所有分法中,蛋糕数量最少的盘子中分到最多的蛋糕数量
     * @param n int整型 n个盘子
     * @param a int整型 a蛋糕数量
     * @param b int整型 b蛋糕数量
     * @return int整型
     */
    int solve(int n, int a, int b) {
        // write code here
        if(a+b == n) return 1;
        int ans=1;
        for(int i=1; i<n; i++){
            int tmp1=a/i;
            int tmp2=b/(n-i);
            ans=max(ans,min(tmp1,tmp2));
        }
        //cout<<ans<<endl;
        return ans;
    }
};

B 牛牛凑数字

题解:贪心。先找最小的价钱的数字,如果最小价钱的数字都买不起,就输出-1;否则尽量买最多的数字,然后如果剩余了钱,就把对应数字“后悔”,加剩余钱去买更大的数字替换掉最开始的数字,循环就好了。

class Solution {
public:
    /**
     * 得到牛牛能够凑到的最大的数字
     * @param n int整型 牛牛能够承受的价格
     * @param a int整型vector 1-9这九个数字的价格数组
     * @return string字符串
     */
    string solve(int n, vector<int>& a) {
        // write code here
        std::vector<char> an;
        int ans=0x3f3f3f3f;
        int k=-1;
        for(int i=0; i<(int)a.size(); i++){
            if(a[i] <= ans){
                ans=a[i];
                k=i+1;
            }
        }
        string no="-1";
        if(ans > n) return no;
        int num=n/ans;
        int tmp=n%ans;
        for(int i=0; i<num; i++){
            an.emplace_back('0'+k);
        }
        //cout<<tmp<<endl;
        int j=0;
        while(tmp){
            int tt=ans+tmp;
            bool ok=false;
            for(int i=0; i<(int)a.size(); i++){
                if(tt>=a[i]){
                    an[j]='0'+i+1;
                    ok=true;
                    tmp=tt-a[i];
                }
            }
            j++;
            if(j == (int)an.size() || !ok) break;
        }
        string s;
        for(auto i:an){
            s+=i;
        }
        return s;
    }
};

C 牛妹的野菜

题解:记忆化搜索。保存每个节点向下走的最大价值和对应下一个节点的编号,然后搜索就好了。

const int maxn = 1e6+10;
const int inf=0x3f3f3f3f;
int dp[maxn][2];
struct edge{
    int to,nex;
}e[maxn<<1];
int head[maxn],ecnt;
void init(){
    memset(head,0,sizeof head);
    memset(dp,-1,sizeof dp);
    ecnt=0;
}
void add(int from,int to){
    e[++ecnt].to=to;
    e[ecnt].nex=head[from];
    head[from]=ecnt;
}
void dfs(int root,int par,vector<int>& potatoNum){
    if(dp[root][0] != -1) return ;
    bool ok=false;
    for(int i=head[root]; i; i=e[i].nex){
        int son=e[i].to;
        if(son == par) continue;
        ok=true;
        dfs(son,root,potatoNum);
        if(dp[son][0] > dp[root][0]){
            dp[root][0]=dp[son][0];
            dp[root][1]=son;
        }
    }
    if(!ok) dp[root][0]=potatoNum[root-1];
    else dp[root][0]+=potatoNum[root-1];
}
string cal(int x){
    string s="";
    while(x){
        s+= (x%10+'0');
        x/=10;
    }
    string ans="";
    for(int i=s.length()-1; i>=0; i--) ans+=s[i];
    return ans;
}
class Solution {
public:
    /**
     *
     * @param potatoNum int整型vector 依次表示序号为1,2,3..的番薯洞各有多少个番薯
     * @param connectRoad int整型vector<vector<>> 每个一维数组[x,y]表示从第x号番薯洞到第y号有路
     * @return string字符串
     */
    string digSum(vector<int>& potatoNum, vector<vector<int> >& connectRoad) {
        // write code here
        init();
        for(auto i:connectRoad){
            add(i[0],i[1]);
        }
        int ans=-1;
        int k=-1;
        for(int i=1; i<=(int)potatoNum.size(); i++){
            dfs(i,0,potatoNum);
        }
        for(int i=1; i<=(int)potatoNum.size(); i++){
            if(dp[i][0] > ans){
                ans=dp[i][0];
                k=i;
            }
        }
        string ss=cal(k);
        while(dp[k][1] != -1){
            ss+="-";
            ss+=cal(dp[k][1]);
            k=dp[k][1];
        }
        return ss;
    }
};

只会暴力QAQ

全部评论
如果有人跟我一样,C卡在了0.7,可能是数字转字符串的问题。。。
点赞 回复 分享
发布于 2020-07-18 22:54

相关推荐

工作基本定了,比较满意。这深度学习真是难搞啊,论文看不懂,代码看不懂,不会改,创新点???&nbsp;还有一个月中期,怎么搞,已经抑郁了,没有小论文要求,我真是非常幸运了,不然就我这科研能力…………&nbsp;感觉自己对自己失去信心,无时无刻不在否定自己取得一些成绩都是运气好罢了,真的能顺利毕业吗?严重内耗、无力感爆棚啊…………
AI牛可乐:哎呀,听起来你最近压力好大呀,毕业论文和工作的双重压力一定让你感觉像是背了两座山呢。深度学习确实挺复杂的,就像是要在一片迷雾中找到出路一样。但是,你已经很棒了,工作都定好了,这是很大的成就呢! 论文的事情,别太担心。每个人都有看不懂代码和论文的时候,这是正常的。至于创新点嘛,有时候灵感就像小猫一样,需要一点一点地哄出来的。你可以先试试把你看过的资料整理一下,说不定就能找到新的思路呢。 中期答辩前,你可以列个计划,一步一步来,把大问题分解成小问题,一点一点克服。记得,你不是一个人在战斗,你的导师、同学都是你的战友哦。 至于信心嘛,别否定自己,每个人都会有低谷的时候。你已经取得的成绩,都是你实力的体现。毕业不是问题,只要你不放弃,就一定能顺利走过去的。加油哦,我相信你可以的! 对了,如果你愿意的话,可以点击我的头像,我们私信聊,也许我能帮你出出主意,或者就是简单地聊聊天,分散一下你的注意力也好呀。🐮💪🌟
点赞 评论 收藏
分享
8 收藏 评论
分享
牛客网
牛客企业服务