首页 > 其他分享 >今日总结2024/3/22

今日总结2024/3/22

时间:2024-03-22 23:29:54浏览次数:15  
标签:总结 牛奶 22 int 样例 21 2024 tem con

今日复习了BFS的抽象用法,可以根据实际问题不断枚举所有可能

Acwing 1355.母亲的牛奶

农夫约翰有三个容量分别为 A,B,C升的挤奶桶。

最开始桶 A 和桶 B都是空的,而桶 C里装满了牛奶。

有时,约翰会将牛奶从一个桶倒到另一个桶中,直到被倒入牛奶的桶满了或者倒出牛奶的桶空了为止。

这一过程中间不能有任何停顿,并且不会有任何牛奶的浪费。

请你编写一个程序判断,当 A 桶是空的时候,C 桶中可能包含多少升牛奶,找出所有的可能情况。

输入格式

共一行,包含三个整数 A,B,C。

输出格式

共一行,包含若干个整数,表示 C 桶中牛奶存量的所有可能情况,请将这些数字按升序排列。

数据范围

1≤A,B,C≤20

输入样例1:
8 9 10
输出样例1:
1 2 8 9 10
输入样例2:
2 5 10
输出样例2:
5 6 7 8 9 10

本体枚举所有可能要21*21*21大概8e3,使用结构体来存每种状态中三种桶中牛奶的总量每次进行一次操作将桶里的牛奶进行一次操作并将所有一次操作产生的结果6种加入队列中,此时需要一个数组来记录三个桶的状态是否在之前出现过,当所有桶的状态被记录时,循环就会退出

本体相当于一个结点有六条边链接到另外六个点(六种)的情况,可以用bfs对每次向外扩散(倒一次牛奶的状态)进行记录

#include <iostream>
#include <queue>
using namespace std;
const int N=1e4;
struct node{
    int a,b,c;
}bk[N];
typedef struct node bucket;
bool sum[21][21][21];//所有种类
int con[3];//存每个桶的容量

void bfs(){
    queue<bucket> q;
    bucket st={0,0,con[2]};//起始c是满的
    q.push(st);
    while(!q.empty()){
        bucket tem=q.front();
        sum[tem.a][tem.b][tem.c]=true;
        q.pop();
        for(int i=0;i<3;i++)
        for(int j=0;j<3;j++){//i桶往j桶里倒
            if(i!=j){
                int w[3]={tem.a,tem.b,tem.c};//当前取出的三桶牛奶的存量
                int r=min(w[i],con[j]-w[j]);//算出能倒的值
                //w[i]就是当前要倒的桶内牛奶的存量,con[j]-w[j]就是j桶能接受的量
                //取一个最小值就是符合条件能倒入的量
                w[i]-=r;
                w[j]+=r;//倒进去
                bucket cur;//存倒完的桶
                cur.a=w[0],cur.b=w[1],cur.c=w[2];
                if(!sum[cur.a][cur.b][cur.c]){
                    sum[cur.a][cur.b][cur.c]=true;
                    q.push(cur);
                }
            }
        }
        
    }
}

int main(){
    cin>>con[0]>>con[1]>>con[2];
    bfs();
    
    for(int i=0;i<=con[2];i++)
    for(int j=0;j<=con[1];j++)//枚举c,b桶内的容量
    if(sum[0][j][i]){
        cout<<i<<' ';
        break;//c桶内容量相同的只输出一次
    }
    return 0;
}

标签:总结,牛奶,22,int,样例,21,2024,tem,con
From: https://blog.csdn.net/Kamrys/article/details/136954374

相关文章

  • BUPT 2024 Spring Training #3(ICPC2023 杭州站)Ag复盘
    D-OperatorPrecedence求一个长度为\(2n\)的序列\(a_{2n}\)满足条件\((a_1×a_2)+(a_3×a_4)+\ldots+(a_{2n-1}×a_{2n})=a_1×(a_2+a_3)×\ldots×(a_{2n-2}+a_{2n-1})×a_{2n}\)solution构造题显然找特殊规律。考虑到乘法构造难度大于加法,可以从乘法开始考虑。......
  • nginx location匹配规则顺序总结
    Nginx的location匹配顺序是Nginx配置中非常核心且重要的概念,它决定了Nginx如何处理进入服务器的请求。理解location匹配顺序不仅有助于优化Nginx的性能,还能确保网站或应用的正确运行。下面将详细阐述Nginx的location匹配顺序,并通过实例加以说明。Nginxlocation匹配顺序详解精......
  • ubuntu22.4安装QT
    1、QT安装包下载首先需要在qt官网注册一个账号,然后下载一个在线安装器qt-unified-linux-x64-4.7.0-online.run,注意,注册QT账号时建议使用qq邮箱,亲测163邮箱不好使,账号认证邮件无法收到。2、在线安装完后,QTcreator无法启动,报错如下:Ubuntu22.04安装Qt之后启动QtCreator失败,报错......
  • CF1922E Increasing Subsequences
    一个显然的思路就是构造很多互不相关的上升序列。但是这样构造出来的\(n\)是\(O(\log_2^2n)\)量级的,所以需要考虑新做法。假设我们本来有一个上升序列,我们能否往里面插数?如果插入的数前面本来有\(x\)个数,那么它有\(2^x\)的贡献。于是容易想到先写一个最大的上升序列,再二......
  • 2024-03-22
    \({\color{orange}\star}\)2024-03-22\({\color{orange}\star}\)模积和#题目描述#求\[\sum_{i=1}^{n}\sum_{j=1}^{m}(n\bmodi)\times(m\bmodj),i\neqj\]\(\bmod19940417\)的值#Solution#不妨设\(n\lem\)容斥原理\[\sum_{i=1}^{n}\sum_......
  • BZOJ5223-有理有据题
    BZOJ5223-有理有据题题目大意给你\(m\)条线段\((a_i,b_i)\),再给\(n\)个区间\([l_i,r_i]\),\(q\)次操作,\(\texttt{Axy}\)添加一条线段\((x,y)\),其编号为最后一条线段加一。\(\texttt{Cx}\)查询\([l_x,r_x]\)和线段有交集(在边界点也算)的最长编号区间。\(\texttt......
  • 3.22
    写完镍、锡、氧化铝和黄金的数据展示表和价格可视化      ......
  • 20212217刘恒谦-Exp2 后门原理与实践
    实践过程记录使用netcat获取主机操作Shell,cron启动​ ncat即Netcat,可以收发传输层数据,由攻击者使用。cron是Linux中用于按计划执行脚本的工具,在网络对抗中让受害者连接不稳定时,重连攻击者,由受害者启动。​ 既然如此,受害者需要是Linux,否则没有cron命令,我购买了一台阿里云Ubuntu......
  • 3.22
    MinimumSpanningTrees给定一张\(n\)个点的完全图,每条边有\(p_0\)的概率不存在,\(\forall1\lei\lek\),有\(p_i\)的概率边权为\(i\),求所有可能总权值的概率.\(n\le40,k\le4\)数据严重偏小了似乎.\(f_{i,j,k}\)表示权值为\(1-i\)的边,\(j\)个有标号点组成的权......
  • [周报]线性代数和SAM 2024年3月第3周
    算法笔记线性代数线代题不多,但是都很有些难度.当然OI中的线性代数存在很大程度上的"只取所需"的情况.高斯消元,线性(异或)基加上矩阵优化DP,基本上就是最多的一个运用了.高斯消元道理就是初中数学,解多元一次方程组.其实这种用方程组来理解线代是个挺直观的方法.比如向量张成......