hdu 5129 (枚举) The E-pang Palace

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

给你n个点,问能否组成两个不相交的与坐标轴平行的矩形,能就输出两矩形的面积和,不能就输出一个字符串。

由于n的范围就30,所以就是枚举一下就行,先将能够组成的矩形找出来,然后再两两比较,注意的是有一个矩形包含另一个矩形的

情况,此时和就是大矩形的面积。写的时候细心一点就好。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 struct point{
 8    int x,y;
 9 }a[220];
10
11 int ju[31500][5],dir1[220][220];
12
13 int max(int x,int y){return x>y?x:y;}
14
15 bool cmp(point a,point b)
16 {
17     if (a.x==b.x) return a.y<b.y;
18     return a.x<b.x;
19 }
20
21 int check(int *x,int *y){
22    if (a[x[0]].x<a[y[0]].x&&a[x[2]].x>a[y[2]].x&&a[x[1]].y>a[y[1]].y&&a[x[0]].y<a[y[0]].y)
23      return 1;
24    return 0;
25 }
26
27 int main()
28 {
29     int n,i,q,k,u;
30     while (~scanf("%d",&n)&&n)
31     {
32         int ans=0;
33         for (i=1 ; i<=n ; i++) scanf("%d%d",&a[i].x,&a[i].y);
34         sort(a+1,a+n+1,cmp);
35         for (i=1 ; i<=n ; i++){
36             int j=i;
37             while (a[i].x==a[j].x) j++;
38             for (k=i+1 ; k<j ; k++){
39                 for (u=j ; u<=n ; u++){
40                     if (a[u].y==a[i].y){
41                         for (q=u+1 ; q<=n ; q++){
42                             if (a[q].y==a[k].y){
43                                 ju[ans][0]=i;
44                                 ju[ans][1]=k;
45                                 ju[ans][2]=u;
46                                 ju[ans++][3]=q;
47                             }
48                         }
49                     }
50                 }
51             }
52         }
53         /*for (i=0 ; i<ans ; i++) {
54             for (int j=0 ; j<4 ; j++)
55                 cout<<ju[i][j];
56             cout<<endl;
57         }*/
58         int sum=0;
59         if (ans<2) {puts("imp");continue;}
60         for (i=0 ; i<ans ; i++){
61             memset(dir1,0,sizeof(dir1));
62             int ar1=(a[ju[i][2]].x-a[ju[i][0]].x)*(a[ju[i][1]].y-a[ju[i][0]].y);
63             for (k=a[ju[i][0]].x ; k<=a[ju[i][2]].x ; k++){
64                 for (q=a[ju[i][0]].y ; q<=a[ju[i][1]].y ; q++)
65                     dir1[k][q]=1;
66             }
67             for (int j=i+1 ; j<ans ; j++){
68                 int flag=0;
69                 for (k=a[ju[j][0]].x ; k<=a[ju[j][2]].x ; k++){
70                 for (q=a[ju[j][0]].y ; q<=a[ju[j][1]].y ; q++){
71                      if (dir1[k][q]==1) flag=1;
72                 }
73                 }
74                 if (flag==0||check(ju[i],ju[j])||check(ju[j],ju[i])){
75                 int ar2=ar1;
76                 ar2+=(a[ju[j][2]].x-a[ju[j][0]].x)*(a[ju[j][1]].y-a[ju[j][0]].y);
77                 if (check(ju[i],ju[j])) ar2=ar1;
78                 if (check(ju[j],ju[i])) ar2-=ar1;
79                 sum=max(ar2,sum);
80                 }
81             }
82         }
83         if (sum==0) puts("imp");
84         else printf("%d\n",sum);
85     }
86     return 0;
87 }
时间: 2024-10-12 12:32:04

hdu 5129 (枚举) The E-pang Palace的相关文章

字符串(AC自动机):HDU 5129 Yong Zheng&#39;s Death

Yong Zheng's Death Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)Total Submission(s): 224    Accepted Submission(s): 37 Problem Description Some Chinese emperors ended up with a mysterious death. Many historia

HDU 5129 Yong Zheng&#39;s Death

题目链接:HDU-5129 题目大意为给一堆字符串,问由任意两个字符串的前缀子串(注意断句)能组成多少种不同的字符串. 思路是先用总方案数减去重复的方案数. 考虑对于一个字符串S,如图,假设S1,S2,S3,S4,S5,S6均为前缀. 换言之,对于这种字符串,我们计算了三次. 发现,重复的方案数,等于中间如图有颜色的方块的数量.所以我们要做的也就是计数像图中有颜色的小方块的数量. 我们可以通过遍历像S6一样的字符串的数量,来计算重复的方案数.S6满足以下条件: 存在一个前缀S4为S6的后缀,且S

HDU 5339-Untitled(枚举)

题目地址:HDU 5339 题意:给出n个数和一个数a,问a对其中的一些数取余(可以为n个数),是否a能等于0 思路:遍历枚举,每次找<=a的数,然后取余,一直到最后看是否为0 #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include &l

hdu 3006 枚举集合可以产生的所有并集的集合

http://acm.hdu.edu.cn/showproblem.php?pid=3006 刚买的CHERRY键盘 手感真好 可惜不习惯 写代码老是打错,一个题写了一上午,都是各种按错键DEBUG..... 开始想的是DFS  发现好像不行 然后想的是两重循环可以枚举所有的2个集合的并集,3重循环可以枚举所有3个集合的并集,那么n个子集貌似需要n重循环,NP问题啊,,,,, 做法还是从小的数去模拟,因为只有14个,所以状压存储 如第一个例子 四个子集1,2,3,4 二进制0001 0010 0

hdu 3006 枚举集合能够产生的全部并集的集合

http://acm.hdu.edu.cn/showproblem.php? pid=3006 刚买的CHERRY键盘 手感真好 可惜不习惯 写代码老是打错.一个题写了一上午,都是各种按错键DEBUG..... 開始想的是DFS  发现好像不行 然后想的是两重循环能够枚举全部的2个集合的并集.3重循环能够枚举全部3个集合的并集,那么n个子集貌似须要n重循环.NP问题啊,,... 做法还是从小的数去模拟,由于仅仅有14个.所以状压存储 如第一个样例 四个子集1,2,3,4 二进制0001 0010

HDU 5965 枚举模拟 + dp(?)

ccpc合肥站的重现...一看就觉得是dp 然后强行搞出来一个转移方程 即 根据第i-1列的需求和i-1 i-2列的枚举摆放 可以得出i列摆放的种类..加了n多if语句...最后感觉怎么都能过了..然而不是t就是wa..最后看别人的题解 我的dp转移是9*O(n)的 常数要t.. 别人的题解居然都是用模拟的..根据枚举第一列可以得出第二列的摆放姿势 由这两个摆放和第二列的需求可以求出来第三列..以此类推 最后check一下最后两个.. 叉姐的题解里面写了一个dp转移方程..然而并不能看懂..放牛

hdu 4587(枚举+割顶)

TWO NODES Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 2354    Accepted Submission(s): 780 Problem Description Suppose that G is an undirected graph, and the value of stab is defined as fol

HDU 4414 枚举

Finding crosses Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1501    Accepted Submission(s): 802 Problem Description The Nazca Lines are a series of ancient geoglyphs located in the Nazca Des

hdu 2363(枚举+最短路好题)

Cycling Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1247    Accepted Submission(s): 411 Problem Description You want to cycle to a programming contest. The shortest route to the contest migh