问题可以简化成有一个
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 x—max应该表示的是这个区间的 m a x max max,第一次进入的时候就需要更新,当这次循环结束的时候,它一定能成为这个区间的 m a x max max