zoukankan      html  css  js  c++  java
  • CodeForce 589B Layer Cake

    Layer Cake
     

    Dasha decided to bake a big and tasty layer cake. In order to do that she went shopping and bought n rectangular cake layers. The length and the width of the i-th cake layer were ai and bi respectively, while the height of each cake layer was equal to one.

    From a cooking book Dasha learned that a cake must have a form of a rectangular parallelepiped constructed from cake layers of the same sizes.

    Dasha decided to bake the biggest possible cake from the bought cake layers (possibly, using only some of them). It means that she wants the volume of the cake to be as big as possible. To reach this goal, Dasha can cut rectangular pieces out of the bought cake layers. She always cuts cake layers in such a way that cutting lines are parallel to the edges of that cake layer. Dasha isn't very good at geometry, so after cutting out a piece from the original cake layer, she throws away the remaining part of it. Also she can rotate a cake layer in the horizontal plane (swap its width and length).

    Dasha wants her cake to be constructed as a stack of cake layers of the same sizes. Each layer of the resulting cake should be made out of only one cake layer (the original one or cut out from the original cake layer).

    Help Dasha to calculate the maximum possible volume of the cake she can bake using given cake layers.

    Input
     

    The first line contains an integer n (1 ≤ n ≤ 4000) — the number of cake layers that Dasha can use.

    Each of the following n lines contains two integer numbers ai and bi (1 ≤ ai, bi ≤ 106) — the length and the width of i-th cake layer respectively.

    Output

    The first line of the output should contain the maximum volume of cake that can be baked using given layers.

    The second line of the output should contain the length and the width of the resulting cake. If there are many solutions with maximum possible volume, print any of them.

    Examples
    Input
    5
    5 12
    1 1
    4 6
    6 4
    4 6
    Output
    96
    6 4
    Input
    2
    100001 900000
    900001 100000
    Output
    180000000000
    900000 100000
    Note

    In the first example Dasha doesn't use the second cake layer. She cuts 4 × 6 rectangle from the first cake layer and she uses other cake layers as is.

    In the second example Dasha cuts off slightly from the both cake layers.

    题意:

      有 n个蛋糕,给出长和宽,他们的高度都是1, 把这些蛋糕切成一个大的长方体,求最大的面积:

    思路:

      一开始想到了暴力枚举,但是超时,后来用复制函数小小的优化了一下,就OK了,具体看代码

      AC代码:

     1 # include <iostream>
     2 # include <cstring>
     3 # include <cstdio>
     4 # include <vector>
     5 # include <map>
     6 using namespace std;
     7 
     8 const int MAX = 2* 1e4 + 1;
     9  
    10 char s[MAX][105];
    11 char s2[MAX][105];
    12 map <string, int> mp;
    13 vector <int> v[MAX];
    14 int num = 0;
    15  
    16 void init(int k)
    17 {
    18     // 转换大小写
    19     for(int i = 1; s[k][i] != ''; i++)
    20         if(s[k][i] >= 'A' && s[k][i] <= 'Z') 
    21             s2[k][i] = tolower(s[k][i]);
    22         else 
    23             s2[k][i]=s[k][i];
    24  
    25     int p = 1;
    26     for(; s[k][p] != '@'; p++); // 找@
    27     
    28     //  判段字符串相同吗
    29     if(strcmp(s2[k] + p + 1, "bmail.com") == 0)
    30     {
    31         int flag = 0, cnt = 0;
    32         for(int i = 1; s[k][i] != ''; i++)
    33         {
    34             if((s[k][i] == '.' || flag) && i < p)
    35                 continue;
    36             else if(s[k][i] == '+') 
    37                 flag = 1;
    38             else 
    39                 s2[k][++cnt] = tolower(s[k][i]);
    40         }
    41             s2[k][cnt+1] = '';
    42     }
    43     if(!mp[s2[k] + 1])
    44     {
    45         num++;
    46         mp[s2[k] + 1] = num;
    47         v[num].push_back(k);
    48     }
    49     else
    50         v[mp[s2[k]+1]].push_back(k);
    51 }
    52  
    53 int main()
    54 {
    55     int n;
    56     scanf("%d", &n);
    57 
    58 
    59     for(int i = 1; i <= n; i++)
    60     {
    61         scanf("%s", s[i] + 1);
    62         init(i);
    63     }
    64     printf("%d
    ", num);
    65     
    66     for(int i = 1; i <= num; i++)
    67     {
    68         printf("%d ", v[i].size());
    69         for(int j = 0; j < v[i].size(); j++)
    70             printf("%s ",s[v[i][j]] + 1);
    71         
    72         printf("
    ");
    73     }
    74     for(int i = 1; i <= num; i++) 
    75         v[i].clear();
    76    
    77    return 0;
    78 }
    View Code
    生命不息,奋斗不止,这才叫青春,青春就是拥有热情相信未来。
  • 相关阅读:
    试玩mpvue,用vue的开发模式开发微信小程序
    laravel 整合 swoole ,并简单 ab 测试对比性能以及在 PHPstorm 中利用debug调试配置swoole服务中的PHP代码
    移动端固定头部和固定左边第一列的实现方案(Vue中实现demo)
    PhpStorm 2017.3 版本在 Mac 系统 macOS High Sierra 版本 10.13.3 中运行很卡顿
    xdebug : Debug session was finished without being paused
    SVN checkout 出的项目在PHPstorm中打开没有subversion(SVN)选项按钮怎么办?
    PHP应用的CI/CD流程实践与学习:一、PHP运行环境的准备
    Mac环境下PHPstorm配置xdebug开发调试web程序
    『备忘录』elasticsearch 去重分页查询
    Mac下docker搭建lnmp环境 + redis + elasticsearch
  • 原文地址:https://www.cnblogs.com/lyf-acm/p/5791483.html
Copyright © 2011-2022 走看看