计蒜客-A1024 淘宝卖家评价体系

淘宝对所有卖家建立了一套基于数据挖掘的评价体系,使用交易数据、用户评价等对每个卖家的描述真实度、发货速度和服务态度这三个维度进行打分,分数均为可正可负的整数。由于打分总会存在一定偏差,淘宝的算法工程师们只能对每个维度给出一个边界均为整数的分值范围,这三个维度的分值范围在三维直角坐标系中构成了一个顶点坐标均为整数、所有棱均平行于坐标轴的长方体。

计蒜客-A1024 淘宝卖家评价体系_第1张图片

类似二维坐标系中的象限,在三维坐标系中我们用卦限来区别三维空间中的不同区域,卦限的编号顺序如上图所示。请根据输入的长方体算出其在三维直角坐标系中 8 个卦限的体积分别是多少。

输入格式
第一行输入一个数据组数 T (1 ≤ T ≤ 50)。

接下来一共 T 组数据,每组一行输入 6 个整数Xmin、Xmax、Ymin、Ymax、Zmin、Zmax (-1000 ≤ Xmin ≤ Xmax ≤ 1000,-1000 ≤ Ymin ≤ Ymax ≤ 1000,-1000 ≤ Zmin ≤ Zmax ≤ 1000),分别为三个维度的上下边界。

输出格式

每行输出 8 个用空格分隔的非负整数,分别对应输入的长方体在第 1 卦限到第 8 卦限内的体积。如果该长方体没有任何部分在某一个卦限内,该卦限对应的体积输出 0 即可。

样例输入
1
-2 1 -1 1 -2 3

样例输出
3 6 6 3 2 4 4 2

这题如果用暴力破解的话代码行数估计会300+往上,这种写法看起来也复杂但是简便,需要理解,理解透了完全不是问题。需要考虑的就是最小值不为负的时候所在象限为零,并且在正轴计算长度,最大值同理。其他情况可以正常计算。下面附上代码。

#include
using namespace std;
int main()
{
     
	int n,i,j,k,l,x,y,z,num;
	cin>>n;
	for(l=0;l<n;l++)
	{
     
		int a[3][2],b[9];
		for(i=0;i<3;i++)
		{
     
			cin>>a[i][0]>>a[i][1];//依次填入x,y,z的最小值和最大值 
		}
		num=1;//这里是因为有n组数,所以每次都得初始化 
		for(i=0;i<2;i++)//三重循环可以实现2*2*2也就是8次对应8维 
		{
     
			for(j=0;j<2;j++)//核心代码建议理解透彻 
			{
     
				for(k=0;k<2;k++)
				{
     
					x=a[0][k];
					y=a[1][j];
					z=a[2][i];
					if(k==0&&x>0)x=0;//若x最小值为正,则它的负轴所在象限为0 
					else if(k==0&&a[0][1]<0)x=a[0][1]-a[0][0];//若x最大值不为正,则负轴象限需要计算长度 
					if(k==1&&x<0)x=0;//若x最大值为负,则它的正轴所在象限为0 
					else if(k==1&&a[0][0]>0)x=a[0][1]-a[0][0];//若x最小值不为负,则正轴需要计算长度 
					if(j==0&&y>0)y=0;//同上计算y轴
					else if(j==0&&a[1][1]<0)y=a[1][1]-a[1][0];
					if(j==1&&y<0)y=0;
					else if(j==1&&a[1][0]>0)y=a[1][1]-a[1][0]; 
					if(i==0&&z>0)z=0;//同上计算z轴
					else if(i==0&&a[2][1]<0)z=a[2][1]-a[2][0];
					if(i==1&&z<0)z=0;
					else if(i==1&&a[2][0]>0)z=a[2][1]-a[2][0]; 
					b[num]=x*y*z;
					if(b[num]<0)b[num]=-b[num];
					num++;
				}	
			} 
		}
		cout<<b[8]<<" "<<b[7]<<" "<<b[5]<<" "<<b[6]<<" "<<b[4]<<" "<<b[3]<<" "<<b[1]<<" "<<b[2]<<endl;
		//顺序是乱的,但都在,因为b[1]是三个负数相乘,正好是第七象限,所以第七象限的位置我放了b[1],其他同理。 
	}
	return 0;
}

你可能感兴趣的:(c++,计蒜客,ACM,c语言)