巧妙的解决矩形排列和面积

矩形排列的巧解

首先:

给定N个矩形,每个矩形宽W米高H米
请按以下规则将这N个矩形排序,输出排序后的矩形列表

排序规则:
面积小的矩形排在面积大的矩形前面
面积相同的矩形,按照宽高比排序,宽高比大的矩形排在宽高比小的矩形前面
宽高比的定义为 min(W/H, H/W)
面积和宽高比都相同的矩形,按照宽排序,宽度更小的矩形排在宽度更大的矩形前面

我们先进行输入:


 int main()
{
	int N;
	cin >> N;   //输入矩形个数
	int Ns = N;//记录个数
	vector<int>v;  //创建一个矩形用于存放宽和高
	int w, h;   //宽  高
	while (N--)  //一次输入并存放
	{
		cin >> w;
		cin >> h;
		v.push_back(w);
		v.push_back(h);
	}
	 Than(v, Ns);//处理和比较
}

接下来就可以定义比较和处理函数了:

void Than(vector<int>v,int n)
	{
		int max = 0;   //假设最大的面积为0
		for (int i = 0; i < 2 * n; i=i+2)
		{
			if (v[i] * v[i + 1] > max)   // 宽和高相乘与最大面积相比
			{
				max = v[i] * v[i + 1];   //最大面积更改
			}
			else if (v[i] * v[i + 1] == max)  //出现面积相等情况
			{
				int temp=min(v[i] / v[i + 1], v[i + 1] / v[i]);    //求当前矩形的宽高比
				int temp1 = min(v[i - 2] / v[i - 1], v[i - 1] / v[i - 2]);//求出面积相等矩形的宽高比
				if (temp > temp1)   //如果当前的较大则交换
				{
					int w = v[i - 2];
					int h = v[i - 1];
					v[i - 2] = v[i];
					v[i] = w;
					v[i - 1] = v[i + 1];
					v[i + 1] = h;
					i = -2;     //重新回到开头
					max = 0;
				}
				else if(temp==temp1)   //宽高比相等
				{
					if (v[i] < v[i - 2])   //宽小的交换
					{
						int w = v[i - 2];
						int h = v[i - 1];
						v[i - 2] = v[i];
						v[i] = w;
						v[i - 1] = v[i + 1];
						v[i + 1] = h;
						i = -2;
						max = 0;
					}
					else
						continue;
				}
			}
			else     //面积不相等 ,进行交换,小的换到最前面
			{
				int w = v[i];
				int h = v[i +1];
				v[i] = v[i-2];
				v[i - 2] = w;
				v[i + 1] = v[i -1];
				v[i - 1] = h;
				i = -2;
				max = 0;
			}
		}

处理完接下来就是输出啦
只需在Than()函数中加入输出就完成咯

        cout << "输出结果如下:" << endl;
		cout << "宽高序列:" << endl;
		for (vector<int>::iterator it = v.begin(); it < v.end(); it++)  //输出矩形宽高序列
		{
			cout << *it<<" ";
		}
		cout << endl;
		cout << "面积序列:" << endl;
		for (vector<int>::iterator it = v.begin(); it < v.end(); it+=2)  //输出矩形面积序列
		{
			cout << *it*(*(it+1)) << " ";
		}
		cout << endl;
	}

赶快验证结果
在这里插入图片描述
最后以上代码可能不是很完美,请多多关照。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值