zoukankan      html  css  js  c++  java
  • C

    Problem description

    In the evening, after the contest Ilya was bored, and he really felt like maximizing. He remembered that he had a set of n sticks and an instrument. Each stick is characterized by its length li.

    Ilya decided to make a rectangle from the sticks. And due to his whim, he decided to make rectangles in such a way that maximizes their total area. Each stick is used in making at most one rectangle, it is possible that some of sticks remain unused. Bending sticks is not allowed.

    Sticks with lengths a1a2a3 and a4 can make a rectangle if the following properties are observed:

    • a1 ≤ a2 ≤ a3 ≤ a4
    • a1 = a2
    • a3 = a4

    A rectangle can be made of sticks with lengths of, for example, 3 3 3 3 or 2 2 4 4. A rectangle cannot be made of, for example, sticks 5 5 5 7.

    Ilya also has an instrument which can reduce the length of the sticks. The sticks are made of a special material, so the length of each stick can be reduced by at most one. For example, a stick with length 5 can either stay at this length or be transformed into a stick of length 4.

    You have to answer the question — what maximum total area of the rectangles can Ilya get with a file if makes rectangles from the available sticks?

    Input

    The first line of the input contains a positive integer n (1 ≤ n ≤ 105) — the number of the available sticks.

    The second line of the input contains n positive integers li (2 ≤ li ≤ 106) — the lengths of the sticks.

    Output

    The first line of the output must contain a single non-negative integer — the maximum total area of the rectangles that Ilya can make from the available sticks.

    Examples

    Input

    4
    2 4 4 2

    Output

    8

    Input

    4
    2 2 3 5

    Output

    0

    Input

    4
    100003 100004 100005 100006

    Output

    10000800015
    解题思路:题目的意思就是将每个能组成长方形的面积累加求和,并且使得面积S最大。怎么使得S最大呢?做法:将长度先排序,再从长度大的往长度小的贪心,因为每根棍可以选择减掉1或0的长度,所以相邻棍的长度只要相差值不大于1即可组成长方形的一组边,这样一直往前找配对矩形的一组边,将其相乘再累加求和最后就能得到最大的矩形面积。
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=1e5+5;
     4 typedef long long LL;
     5 int n,m=0,a[maxn];LL ans=0,mul=1;
     6 int main(){
     7     cin>>n;
     8     for(int i=0;i<n;++i)cin>>a[i];
     9     sort(a,a+n);
    10     for(int i=n-1;i>0;--i){
    11         if(a[i]-a[i-1]<=1){mul*=a[i-1];i--;m++;}
    12         if(m==2){ans+=mul;mul=1;m=0;}
    13     }
    14     cout<<ans<<endl;
    15     return 0;
    16 }
  • 相关阅读:
    切换svn用户
    表session查询
    http请求响应头信息
    map遍历的四种方法
    java i/o读写
    excel导出
    平安医保权限管理关系
    json发送hppt请求
    weblogic配置路径
    《神经网络和深度学习》系列文章十五:反向传播算法
  • 原文地址:https://www.cnblogs.com/acgoto/p/9157427.html
Copyright © 2011-2022 走看看