zoukankan      html  css  js  c++  java
  • hdu--5128--计算几何<算不上.暴力模拟> && hdu--5131--初级cmp

    首先 给你N个点的坐标 你要找出其中的4个点来构造矩形

    可以选择4个点 或者 一条对角线来进行构造

    4个点 需要写个4层for  对角线只要2层for相比下 还是对角线比较好

    虽然 我们会重复构造相同的矩形出来 但是没关系 题目数据很小的

    接下来 就是矩形是否相交的判断了

    注意一种特殊情况 矩阵 I 内含与 矩阵 J 或者是矩阵 j 内含i的含 就是得到外面的矩阵的面积

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 int n , cnt;
     6 const int size = 35;
     7 struct data
     8 {
     9     int x , y;
    10     int minX , minY , maxX , maxY , area;
    11 }node[size],mat[size];
    12 bool vis[220][220];
    13 
    14 void getMat( )
    15 {
    16     for( int i = 0 ; i<n-1 ; i++ )
    17     {
    18         for( int j = i+1 ; j<n ; j++ )
    19         {
    20             if( node[i].x==node[j].x || node[i].y==node[j].y )
    21                 continue;
    22             int minX = min( node[i].x , node[j].x );
    23             int maxX = max( node[i].x , node[j].x );
    24             int minY = min( node[i].y , node[j].y );
    25             int maxY = max( node[i].y , node[j].y );
    26             if( vis[minX][minY] && vis[minX][maxY] && vis[maxX][minY] && vis[maxX][maxY] )
    27             {
    28                 mat[cnt].minX = minX , mat[cnt].minY = minY , mat[cnt].maxX = maxX , mat[cnt].maxY = maxY;
    29                 mat[cnt++].area = (maxX-minX) * (maxY-minY);
    30             }
    31         }
    32     }
    33 }
    34 
    35 int solve( int i , int j )
    36 {
    37     //i与j相同
    38     if( mat[i].minX==mat[j].minX && mat[i].maxX==mat[j].maxX && mat[i].minY==mat[j].minY && mat[i].maxY==mat[j].maxY )
    39         return -1;
    40     //i包含了J
    41     if( mat[i].minX<mat[j].minX && mat[i].maxX>mat[j].maxX && mat[i].minY<mat[j].minY && mat[i].maxY>mat[j].maxY )
    42         return mat[i].area;
    43     //j包含了i
    44     if( mat[i].minX>mat[j].minX && mat[i].maxX<mat[j].maxX && mat[i].minY>mat[j].minY && mat[i].maxY<mat[j].maxY )
    45         return mat[j].area;
    46     //重叠的情况 以i或j为参考都可以 固定一个
    47     if( (mat[i].minX>=mat[j].minX&&mat[i].minX<=mat[j].maxX) || (mat[i].maxX>=mat[j].minX&&mat[i].maxX<=mat[j].maxX) )
    48     {
    49         if( (mat[i].minY>=mat[j].minY&&mat[i].minY<=mat[j].maxY) || (mat[i].maxY>=mat[j].minY&&mat[i].maxY<=mat[j].maxY) )
    50         {
    51             return -1;
    52         }
    53     } 
    54     if( (mat[j].minX>=mat[i].minX&&mat[j].minX<=mat[i].maxX) || (mat[j].maxX>=mat[i].minX&&mat[j].maxX<=mat[i].maxX) )
    55     {
    56         if( (mat[j].minY>=mat[i].minY&&mat[j].minY<=mat[i].maxY) || (mat[j].maxY>=mat[i].minY&&mat[j].maxY<=mat[i].maxY) )
    57         {
    58             return -1;
    59         }
    60     }
    61     return mat[i].area + mat[j].area;
    62 }
    63 
    64 int main()
    65 {
    66     int ans;
    67     while( cin >> n && n )
    68     {
    69         memset( vis , false , sizeof(vis) );
    70         cnt = 0;
    71         for( int i = 0 ; i<n ; i++ )
    72         {
    73             cin >> node[i].x >> node[i].y;
    74             vis[ node[i].x ][ node[i].y ] = true;
    75         }
    76         getMat( );
    77         ans = -1;
    78         for( int i = 0 ; i<cnt-1 ; i++ )
    79         {
    80             for( int j = i+1 ; j<cnt ; j++ )
    81             {
    82                 ans = max( ans , solve(i,j) );
    83             }
    84         }
    85         if( ans==-1 )
    86             cout << "imp" << endl;
    87         else
    88             cout << ans << endl;
    89     }
    90     return 0;
    91 }
    View Code

    虽然写麻烦了=_=  但毕竟容易接受 就是判断出所有的不同情况来

    懒得再开一篇了 将5131也放一起吧

    它相比上题 难度差不多 但是容易写啊 没什么要注意的。。

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <string>
     4 #include <map>
     5 using namespace std;
     6 
     7 int n;
     8 const int size = 220;
     9 map<string,int>mp;
    10 struct data
    11 {
    12     string name;
    13     int num;
    14 }node[size];
    15 
    16 bool cmp( const data p , const data q )
    17 {
    18     if( p.num == q.num )
    19     {
    20         return p.name < q.name;
    21     }
    22     return p.num > q.num;
    23 }
    24 
    25 void work( )
    26 {
    27     for( int i = 0 ; i<n ; i++ )
    28     {
    29         cout << node[i].name << " " << node[i].num << endl;
    30         mp[ node[i].name ] = i;
    31     }
    32 }
    33 
    34 int main()
    35 {
    36     cin.sync_with_stdio(false);
    37     int m , index , temp;
    38     char str[60];
    39     while( cin >> n && n )
    40     {
    41         mp.clear();
    42         for( int i = 0 ; i<n ; i++ )
    43         {
    44             cin >> node[i].name >> node[i].num;
    45         }
    46         sort( node , node+n , cmp );
    47         cin >> m;
    48         work( );
    49         while( m-- )
    50         {
    51             cin >> str;
    52             temp = mp[str];
    53             index = temp;
    54             while( index>=1 )
    55             {
    56                 if( node[index-1].num == node[index].num )
    57                 {
    58                     -- index;
    59                 }
    60                 else
    61                     break;
    62             }
    63             cout << index+1;
    64             index = max( 1 , temp-index+1 );
    65             if( index>1 )
    66                 cout << " " << index;
    67             cout << endl;
    68         }
    69     }
    70     return 0;
    71 }
    View Code
  • 相关阅读:
    很多网络库介绍
    CFileFind
    C#编写COM组件
    使用javascript调用com组件
    C++ 解析Json——jsoncpp
    休眠与开机自动运行等VC代码
    win7 vs2012/2013 编译boost 1.55
    VC中的字符串转换宏
    InstallShield 静默安装
    CAD版本 注册表信息
  • 原文地址:https://www.cnblogs.com/radical/p/4143964.html
Copyright © 2011-2022 走看看