一共有N根棒子,每根棒子的长度已知,而且我们可以将任意棒子的长度减1,问所有棒子能够组成的举行的最大的面积和。
思路:
1、首先将棒子的长度按照从小到大排序,那么我们每次贪心出来两个矩形的长,然后再贪心出来两个矩阵的宽,每当能够使得其组成一个矩形的时候,累加其和即可。
2、贪心找长和宽的时候,只需要每次枚举临近的两根棒子即可,如果其长度差==0或者是==1,那么其两根棒子的最小值就可以作为两个对着的边的长度(可能是作为长,也可能作为是宽)。
Ac代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll __int64
ll a[1000006];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
scanf("%I64d",&a[i]);
}
sort(a,a+n);
ll chang=0;
ll kuan=0;
ll output=0;
for(int i=n-1;i>=1;i--)
{
if(a[i]==a[i-1]||a[i]==a[i-1]+1)
{
if(chang==0)
chang=a[i-1],i--;
else if(kuan==0)
kuan=a[i-1],i--;
}
if(chang!=0&&kuan!=0)
{
output+=chang*kuan;
chang=0;
kuan=0;
}
}
printf("%I64d\n",output);
}
}