牛客小白月赛112

牛客小白月赛112

2025.03.23

A 智乃的天平

题目简介:简单的瞪眼题

思路:

枚举天平的各种情况即可

几分钟就AC了


B 智乃爬山

题目简介:模拟,用数组实现

秒了的水题


C 智乃放球

题目简介:思维

注意点:

1.消除的球的个数是桶的容量的倍数

(n-q)%k==0

2.剩余的球的个数最大为m*(k-1);

q<=m*(k-1)

3.ans结果开long long


D 智乃的“K”叉树

题目简介:虽以树为背景,但考察的是问题的分析能力,与树关系不大

注意点:

1.分析样例,发现将某个节点定为根节点时,其出度等于孩子数其余节点的出度减一为孩子数

2.由此产生的贪心思想:选择出度不是最大的结点中编号最小的节点

3.特判所有节点出度一样的情况


E 智乃的“凑数”题(Easy Version)

题目简介:dfs暴力剪枝,或dp的01背包问题,其中有很多细节

思路:

1.通过对题干的分解,行列和的乘积,不难想到对每次问询先枚举因数,再在因数里找结果

2.而把找到因数后,需要判断是否为需求状态,因此我们可以dp动规来表示每个状态

  • bool类型的dp[i][j]表示行和为i,列和为j是否可行
  • 零一背包,需要倒推,否则会出现一个数使用多次的情况,也就错误的变成完全背包
  • 对于每种状态,一旦确定就可以continue,而递推过程中,顺便用pre[x][y]记录(x,y)的前驱状态和本状态的差值,对应输出行和列的内容,这里,用正数代表x维度的差值,用负数代表y维度的差值
 dp[0][0]=1;
    for(int i = 1;i<=n;i++){
        for(int x=100;x>=0;x--){
            for(int y=100;y>=0;y--){
            if(dp[x][y]) continue;
            if(x>=a[i]&&dp[x-a[i]][y]){
                dp[x][y]=1;
                pre[x][y]=a[i];
            }
            else if(y>=a[i]&&dp[x][y-a[i]]){
                dp[x][y]=1;
                pre[x][y]=-a[i];
                }
            }
        }
    }

3.找到需求状态后,回溯前驱状态,并把回溯过程存入vector

 for(int i =1;i<=ceil(sqrt(q));i++){
    if(q%i!=0)continue;
    if(dp[i][q/i]){
        vector<int>vx,vy;
        int x = i,y =q/i;
        while(x!=0||y!=0){
            if(pre[x][y]>0){
                vx.push_back(pre[x][y]);
                x-=pre[x][y];
                }
            else{
                vy.push_back(-pre[x][y]);
                y+=pre[x][y];
            }
        }
        cout<<"Yes"<<endl;

4.遍历vector并按照格式输出答案

 cout<<vx.size()<<" "<<vy.size()<<endl;
        for(int j = 0;j<vx.size();j++) cout<<vx[j]<<" ";
        cout<<endl;
        for(int j = 0;j<vy.size();j++) cout<<vy[j]<<" ";
        cout<<endl;
        return ;
posted @   Fllipped  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
点击右上角即可分享
微信分享提示