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

    http://acm.hdu.edu.cn/showproblem.php?pid=5128

    题意:给定N个点,选出其中8个点组成两个矩形,使得两个矩形的面积和最大。

    思路:找出所有的矩形,然后枚举,挑选求中的两个矩形,判断位置关系,符合条件求出他们的和最大值。坑点:可以内含,内含的时候计算外面的矩形的面积。

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <algorithm>
      4 using namespace std;
      5 
      6 int n;
      7 struct node
      8 {
      9     int x,y;
     10     bool operator <(const node &a) const
     11     {
     12         return (x<a.x)||(x==a.x&&y<a.y);
     13     }
     14 } p[50000],q[50000],f1[10],f2[10];
     15 
     16 struct node1
     17 {
     18     int num[10];
     19 } c[100000];
     20 
     21 int main()
     22 {
     23     //freopen("sss.txt","w",stdout);
     24     while(scanf("%d",&n)!=EOF)
     25     {
     26         if(n==0) break;
     27 
     28         for(int i=1; i<=n; i++)
     29         {
     30             scanf("%d %d",&p[i].x,&p[i].y);
     31         }
     32         if(n<8)
     33         {
     34             printf("imp
    ");
     35             continue;
     36         }
     37         sort(p+1,p+n+1);
     38         int t1=0;
     39         for(int i=1; i<=n; i++)
     40         {
     41             for(int j=1; j<=n; j++)
     42             {
     43                 if(i==j) continue;
     44                 for(int a=1; a<=n; a++)
     45                 {
     46                     if(i==a||j==a) continue;
     47                     for(int b=1; b<=n; b++)
     48                     {
     49                         if(i==b||j==b||a==b) continue;
     50                         q[0]=p[i];
     51                         q[1]=p[j];
     52                         q[2]=p[a];
     53                         q[3]=p[b];
     54                         sort(q,q+4);
     55                         if(q[0].x!=q[1].x||q[0].y!=q[2].y||q[2].x!=q[3].x||q[3].y!=q[1].y)
     56                         {
     57                             continue;
     58                         }
     59                         if(q[0].x!=q[3].x&&q[0].y!=q[3].y)
     60                         {
     61                             c[t1].num[0]=i;
     62                             c[t1].num[1]=j;
     63                             c[t1].num[2]=a;
     64                             c[t1++].num[3]=b;
     65                         }
     66                     }
     67                 }
     68             }
     69         }
     70         int ans=-1;
     71         for(int i=0; i<t1; i++)
     72         {
     73             f1[0]=p[c[i].num[0]];
     74             f1[1]=p[c[i].num[1]];
     75             f1[2]=p[c[i].num[2]];
     76             f1[3]=p[c[i].num[3]];
     77             sort(f1,f1+4);
     78             for(int j=0; j<t1; j++)
     79             {
     80                 if(i==j) continue;
     81                 f2[0]=p[c[j].num[0]];
     82                 f2[1]=p[c[j].num[1]];
     83                 f2[2]=p[c[j].num[2]];
     84                 f2[3]=p[c[j].num[3]];
     85                 sort(f2,f2+4);
     86                 bool flag=false;
     87                 for(int ii=0; ii<4; ii++)
     88                 {
     89                     for(int jj=0; jj<4; jj++)
     90                     {
     91                         if(p[c[i].num[ii]].x==p[c[j].num[jj]].x&&p[c[i].num[ii]].y==p[c[j].num[jj]].y)
     92                         {
     93                             flag=true;
     94                             break;
     95                         }
     96                     }
     97                     if(flag) break;
     98                 }
     99                 if(flag) continue;
    100                 if(f1[0].x<=f2[0].x&&f2[0].x<=f1[2].x&&f2[0].y<=f1[1].y&&f2[1].y>=f1[1].y&&f2[2].x>=f1[2].x)
    101                 {
    102                      continue;
    103                 }
    104                 if(f1[0].x<=f2[0].x&&f2[0].x<=f1[2].x&&f2[0].y<=f1[1].y&&f2[1].y>=f1[0].y&&f2[2].x>=f1[2].x)
    105                 {
    106                      continue;
    107                 }
    108                 if(f1[0].x>=f2[0].x&&f1[0].x<=f2[2].x&&f1[0].y<=f2[1].y&&f1[1].y>=f2[1].y&&f1[2].x>=f2[2].x)
    109                 {
    110                     continue;
    111                 }
    112                 if(f1[0].x>=f2[0].x&&f1[0].x<=f2[2].x&&f1[0].y<=f2[1].y&&f1[1].y>=f2[0].y&&f1[2].x>=f2[2].x)
    113                 {
    114                     continue;
    115                 }
    116                 if(f1[0].x<=f2[0].x&&f2[0].x<=f1[2].x&&f2[0].y<=f1[1].y&&f2[1].y>=f1[0].y&&f2[0].y<=f1[0].y)
    117                 {
    118                     continue;
    119                 }
    120                 if(f1[0].x<=f2[0].x&&f2[0].x<=f1[2].x&&f2[0].y>=f1[0].y&&f2[0].y<=f1[1].y&&f2[1].y>=f1[1].y)
    121                 {
    122                     continue;
    123                 }
    124                 if(f2[0].x<=f1[0].x&&f1[0].x<=f2[2].x&&f1[0].y<=f2[1].y&&f1[1].y>=f2[0].y&&f1[0].y<=f2[0].y)
    125                 {
    126                     continue;
    127                 }
    128                 if(f2[0].x<=f1[0].x&&f1[0].x<=f2[2].x&&f1[0].y>=f2[0].y&&f1[0].y<=f2[1].y&&f1[1].y>=f2[1].y)
    129                 {
    130                     continue;
    131                 }
    132                 int s=-1;
    133                 if(f1[0].x>f2[0].x&&f1[2].x<f2[2].x&&f1[0].y>f2[0].y&&f1[1].y<f2[1].y)
    134                 {
    135                     s=(f2[1].y-f2[0].y)*(f2[2].x-f2[0].x);
    136                 }
    137                 else if(f2[0].x>f1[0].x&&f2[2].x<f1[2].x&&f2[0].y>f1[0].y&&f2[1].y<f1[1].y)
    138                 {
    139                    s=(f1[1].y-f1[0].y)*(f1[2].x-f1[0].x);
    140                 }
    141                 else
    142                 s=(f1[1].y-f1[0].y)*(f1[2].x-f1[0].x)+(f2[1].y-f2[0].y)*(f2[2].x-f2[0].x);
    143                 ans=max(ans,s);
    144             }
    145         }
    146         if(ans==-1) printf("imp
    ");
    147         else
    148         printf("%d
    ",ans);
    149     }
    150     return 0;
    151 }
    View Code
  • 相关阅读:
    中断 异常 系统调用的比较
    线性结构-线性表
    数据结构引例
    友链
    投喂
    给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列
    C++类内存分布
    内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
    C++内存管理学习笔记(7)
    C++内存管理学习笔记(6)
  • 原文地址:https://www.cnblogs.com/fanminghui/p/4229583.html
Copyright © 2011-2022 走看看