Codeforces Round #297 (Div. 2) C. Ilya and Sticks

来源:互联网 发布:君子去仁 恶乎成名 编辑:程序博客网 时间:2024/05/23 21:51

这里写图片描述

这里写图片描述

题目大意:给出n个棒子的长度, 每个棒子可以变为自己的长度 - 1, 问可以组成题目中要求的矩形的面积最大是多少。

解题思路:显然这道题会用到贪心的思想,我们先把给的n个棒子的长度从大到小排序(当然此处有个小优化,因为矩形是由一对长宽组成,所以输入的n小于4直接打印出0) 从开头遍历 因为每个棒子可以变为自己的长度-1 来使用 所以我们查找有没有挨着的棒子有没有差距小于等于1的 有我们就记录当前的棒子长度(注意 此处记录的是当前棒子长度-1) 可以把它看成矩形的长/宽,此处可以直接计算面积 开个数count1来判断该不该算另一个矩形了。 当count1等于2 说明这个矩形组成,把count1=0,面积为1 继续到for循环结束。。。

下面我就直接上代码了、、

当然此题要用long long

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <map>#include <cmath>#include <queue>#include <string>#include <vector>#include <set>#include <stack>using namespace std;#define ll long long#define sc(x) scanf("%I64d",&x)#define pr(x) printf("%I64d\n",x)#define maxn 100005ll cnt;ll a[maxn];bool cmp(int a,int b){    return a>b;}int main(){    ll n;    while(~scanf("%I64d",&n))    {        cnt=0;        for(int i=1;i<=n;i++)            sc(a[i]);        sort(a+1,a+1+n,cmp);//从大到小排序        ll num=1,count1=0;        for(int i=1;i<=n-1;i++)        {            if(a[i]-a[i+1]<=1)            {                num*=a[i+1];//计算面积                count1++;                i++;//满足条件后            }            if(count1==2)//组成一个矩形            {                cnt+=num;//面积                num=1;//下一个面积初始化                count1=0;//判断是否组成矩形初始化            }        }        pr(cnt);    }    return 0;}

END!!!!!!!!!!!!!!

1 0
原创粉丝点击