ACW 4226. 非常可乐 day7

感觉和上次罐子那道题差不多啊 就是变成三维的罢了  O(n^3)

```

#include <bits/stdc++.h>
using namespace std;
const int N = 110;
const int mod =100003;

#define endl '\n'
#define Endl '\n'
#define inf 1e18
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int g[N][N][N],n,m,s;
signed main(){
    fast
    while(1){
        cin>>s>>n>>m;
        if(!n&&!m&&!s)break;
        if(s%2){
            cout<<"NO"<<endl;
            continue;
        }
        queue<tuple<int,int,int>>q;
        q.push({0,0,s});
        memset(g,0x3f,sizeof g);
        g[0][0][s]=0;
        while(q.size()){
            auto [x,y,z]=q.front();
            q.pop();
            if(x){
                int sum=x+y;
                if(sum>m&&g[sum-m][m][z]==0x3f3f3f3f)g[sum-m][m][z]=g[x][y][z]+1,q.push({sum-m,m,z});
                else if(g[0][sum][z]==0x3f3f3f3f)g[0][sum][z]=g[x][y][z]+1,q.push({0,sum,z});
                sum=x+z;
                if(sum>s&&g[sum-s][y][s]==0x3f3f3f3f)g[sum-s][y][s]=g[x][y][z]+1,q.push({sum-s,y,s});
                else if(g[0][y][sum]==0x3f3f3f3f)g[0][y][sum]=g[x][y][z]+1,q.push({0,y,sum});
            }
            if(y){
                int sum=x+y;
                if(sum>n&&g[n][sum-n][z]==0x3f3f3f3f)g[n][sum-n][z]=g[x][y][z]+1,q.push({n,sum-n,z});
                else if(g[sum][0][z]==0x3f3f3f3f)g[sum][0][z]=g[x][y][z]+1,q.push({sum,0,z});
                sum=y+z;
                if(sum>s&&g[x][sum-s][s]==0x3f3f3f3f)g[x][sum-s][s]=g[x][y][z]+1,q.push({x,sum-s,s});
                else if(g[x][0][sum]==0x3f3f3f3f)g[x][0][sum]=g[x][y][z]+1,q.push({x,0,sum});
            }
            if(z){
                int sum=x+z;
                if(sum>n&&g[n][y][sum-n]==0x3f3f3f3f)g[n][y][sum-n]=g[x][y][z]+1,q.push({n,y,sum-n});
                else if(g[sum][y][0]==0x3f3f3f3f)g[sum][y][0]=g[x][y][z]+1,q.push({sum,y,0});
                sum=y+z;
                if(sum>m&&g[x][m][sum-m]==0x3f3f3f3f)g[x][m][sum-m]=g[x][y][z]+1,q.push({x,m,sum-m});
                else if(g[x][sum][0]==0x3f3f3f3f)g[x][sum][0]=g[x][y][z]+1,q.push({x,sum,0});
            }
        }
        int ans=2e9;
        int r=s/2;
        for(int i=0;i<=s;i++){
            ans=min(ans,g[r][r][i]);
            ans=min(ans,g[i][r][r]);
            ans=min(ans,g[r][i][r]);
        }
        cout<<ans<<endl;
    }
    return 0^0;
}

```

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值