【第一周补题】:切蛋糕

问题可以简化成有一个 n × n × n n\times n \times n n×n×n大小的正方体,以一个顶点为原点建立三维坐标系,以相连接的三条棱为三个坐标轴。
假设切蛋糕的刀面,必定与三个坐标轴( x , y , z x , y ,z x,y,z)之一垂直。

现在知道了每一刀切下去的方向和刀面距离原点的距离,你要做的就是帮 s h y shy shy 算出每一刀切完之后,最大蛋糕块的体积。

提示:题目中的蛋糕可以认为是刚体,切割蛋糕不会造成任何损失。

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
const int N=2e5+50;
int x[N];
int y[N];
int z[N];
int x_cnt,y_cnt,z_cnt;
string dir[N];
signed main()
{
    cin>>n>>m;
    int x_max=n;//全局的max
    int y_max=n;
    int z_max=n;
    for(int i=0;i<m;i++)
    {   
        cin>>dir[i];
    }   
    for(int i=0;i<m;i++)
    {
        if(dir[i]=="x")
        {
            cin>>x[++x_cnt];
            x[x_cnt+1]=n;//记得初始化
            sort(x,x+x_cnt+2);
//            x_max=n;
            for(int j=1;j<=x_cnt+1;j++)
            {
                if(j==1||x[j]-x[j-1]>x_max)//x_max表示的是当前这次搜索中的max
                {
                    x_max=x[j]-x[j-1];
                }
            }

        }
        else if(dir[i]=="y")
        {
//            y_max=n;
            cin>>y[++y_cnt];
            y[y_cnt+1]=n;
            sort(y,y+y_cnt+2);
            for(int j=1;j<=y_cnt+1;j++)
            {
                if(j==1||y[j]-y[j-1]>y_max)
                {
                    y_max=y[j]-y[j-1];
                }
            }
        }
        else
        {
//            z_max=n;
            cin>>z[++z_cnt];
            z[z_cnt+1]=n;
            sort(z,z+z_cnt+2);
            for(int j=1;j<=z_cnt+1;j++)
            {
                if(j==1||z[j]-z[j-1]>z_max)
                {
                    z_max=z[j]-z[j-1];
                }
            }
        }
        cout<<x_max*z_max*y_max<<endl;
    }


    return 0;
}

注意点:每一次循环中的 x — m a x x _ —max xmax应该表示的是这个区间的 m a x max max,第一次进入的时候就需要更新,当这次循环结束的时候,它一定能成为这个区间的 m a x max max

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值