hdu--5128--计算几何<算不上.暴力模拟> && hdu--5131--初级cmp
首先 给你N个点的坐标 你要找出其中的4个点来构造矩形
可以选择4个点 或者 一条对角线来进行构造
4个点 需要写个4层for 对角线只要2层for相比下 还是对角线比较好
虽然 我们会重复构造相同的矩形出来 但是没关系 题目数据很小的
接下来 就是矩形是否相交的判断了
注意一种特殊情况 矩阵 I 内含与 矩阵 J 或者是矩阵 j 内含i的含 就是得到外面的矩阵的面积
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
虽然写麻烦了=_= 但毕竟容易接受 就是判断出所有的不同情况来
懒得再开一篇了 将5131也放一起吧
它相比上题 难度差不多 但是容易写啊 没什么要注意的。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
just follow your heart