有n根厚度可以忽略不计的火柴,第i根火柴的长度为aj。 约翰想要从中选取四根火柴(显然每根火柴只能被选取一次),并用这四根火柴分别作为四条边围成 一个矩形。约翰想要你告诉他,在所有选取方案中,矩形面积的最大值是多少。
代码如下,如有帮助,请采纳一下,谢谢。
#include <stdio.h>
#include <map>
using namespace std;
int main()
{
printf("请输入火柴的根数:");
int n;
scanf("%d",&n);
printf("请输入火柴的长度:");
int buf[100] = {0}; //存储火柴的长度
for(int i = 0; i < n; i++)
scanf("%d",&buf[i]);
//1.统计每种长度的火柴的根数,因为如果要组成矩形
//至少需要2根相同长度的火柴
map<int,int> mapLength;
map<int,int>::iterator it = mapLength.begin();
for (int i = 0; i < n; i++)
{
it = mapLength.find(buf[i]);
if (it == mapLength.end())
{
mapLength.insert(pair<int,int>(buf[i],1));
}else
{
int len = it->second + 1;
mapLength.erase(it);
mapLength.insert(pair<int,int>(buf[i],len));
}
}
//2.将map中数量少于2的火柴删除
for (it = mapLength.begin(); it != mapLength.end(); )
{
if (it->second < 2)
{
mapLength.erase(it);
it = mapLength.begin();
}else
it++;
}
for (it = mapLength.begin(); it != mapLength.end(); it++)
printf("长度为%d的火柴数量=%d\n",it->first,it->second);
//因为map能够根据key自动排序,且按照从小到大的顺序排列
//所以,map中最后一个元素是最长的火柴长度,
//找最大矩形的话,就取最后两个元素的长度即可
int mj = 0;
if (mapLength.size() < 2)
{
//如果map中没有2组相同长度的火柴,则说明无法组成矩形
//do nothing
printf("无法组成矩形\n");
}else
{
it = mapLength.end();
it--;
int leng = it->first;
it--;
int leng2 = it->first;
mj = leng * leng2;
printf("最大面积=%d * %d = %d\n",leng,leng2,mj);
}
getchar();
getchar();
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632