zoukankan      html  css  js  c++  java
  • The E-pang Palace

    题目:HDU5128 The E-pang Palace

    解题思路:1.由于pillar的个数只有30个,故rectangular的个数最多15*14/2=105个,故可用暴力解法枚举rectangular的个数。

         2.把每个点都作为rectangular左下角的点,进行枚举所有。

         3.把找到的rectangular保存左下角和右上角x,y的坐标。

         4.把找到的rectangular进行两两判断是否符合条件,找到最大的面积和。

         5.注意2个rectangular嵌套的情况也是符合条件的,并且只算大的rectangular的面积。

    代码如下:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 
     5 using namespace std;
     6 
     7 struct Pillar
     8 {
     9     int x;
    10     int y;
    11 }pillar[35];
    12 
    13 struct Rect
    14 {
    15     int x1;
    16     int y1;
    17     int x2;
    18     int y2;
    19 }rect[1000];
    20 
    21 int mp[210][210];
    22 
    23 int main()
    24 {
    25     int n;
    26     while (scanf("%d", &n) && n)
    27     {
    28         int l = 0;
    29         memset(mp, 0, sizeof(mp));
    30         int i, j, k;
    31         for (i = 0; i < n; i++)
    32         {
    33             scanf("%d%d", &pillar[i].x, &pillar[i].y);
    34             mp[pillar[i].x][pillar[i].y] = 1;
    35         }
    36         for (i = 0; i < n; i++)
    37         {
    38             for (j = pillar[i].x + 1; j <= 200; j++)
    39             {
    40                 if (mp[j][pillar[i].y])
    41                 {
    42                     for (k = pillar[i].y + 1; k <= 200; k++)
    43                     {
    44                         if (mp[pillar[i].x][k] && mp[j][k])
    45                         {
    46                             rect[l].x1 = pillar[i].x;
    47                             rect[l].y1 = pillar[i].y;
    48                             rect[l].x2 = j;
    49                             rect[l].y2 = k;
    50                             l++;
    51                         }
    52                     }
    53                 }
    54             }
    55         }
    56         int sum = 0;
    57         for (i = 0; i < l; i++)
    58         {
    59             for (j = i + 1; j < l; j++)
    60             {
    61                 int s = 0;
    62                 if ((rect[i].x1 - rect[j].x1) * (rect[i].x2 - rect[j].x2) < 0 && (rect[i].y1 - rect[j].y1) * (rect[i].y2 - rect[j].y2) < 0)
    63                 {
    64                     s = max((rect[i].y2 - rect[i].y1) * (rect[i].x2 - rect[i].x1), (rect[j].y2 - rect[j].y1) * (rect[j].x2 - rect[j].x1));
    65                 }
    66                 else if (rect[i].x1 > rect[j].x2 || rect[i].x2 < rect[j].x1 || rect[i].y1 > rect[j].y2 || rect[i].y2 < rect[j].y1)
    67                 {
    68                     s = (rect[i].y2 - rect[i].y1) * (rect[i].x2 - rect[i].x1) + (rect[j].y2 - rect[j].y1) * (rect[j].x2 - rect[j].x1);
    69                 }
    70                 sum = max(sum, s);
    71             }
    72         }
    73         if (sum)
    74         {
    75             printf("%d
    ", sum);
    76         }
    77         else
    78         {
    79             printf("imp
    ");
    80         }
    81     }
    82 
    83 
    84     return 0;
    85 }

    AC如下:

  • 相关阅读:
    ORA12560: TNS: 协议适配器错误
    eclipse无法识别Web项目的问题
    搭建eclipse+tomcat开发环境
    初探弹出层的实现原理
    样式可控的左右选择组件
    在TSQL中用队列来遍历层级数据
    复利计算工具 wpf
    浏览WPF中内置颜色名对应的颜色
    原创:通过VS 2010+SVN为SQL Server提供数据库版本管理
    原创:学习英语小助手(阅读粘贴的英文,使用MVVM)
  • 原文地址:https://www.cnblogs.com/sunjieee/p/4151916.html
Copyright © 2011-2022 走看看