poj 1319

题目:http://poj.org/problem?id=1319

题意:给出一个容器的尺寸  a * b,在这个容器里装直径是单位长度的管子,有两种装的办法,一种是题目里面给的图 a,图 b,另一种是图 c,图 d,问最多可以装多少个管子,

前两个图那样的很好计算,管子的数目就是 floor(a) * floor(b) (floor(x)是指不大于 x 的最大正整数,如 floor(2.8) = 2),如果是后面两组(交错装)那么就要考虑,是 a 为行数,还是 b 为行数两种情况了,后面两种方法画图可以知道,除了第一行管子的高度是 1,其他行的高度为 2 * ( sqrt(3) / 4), 如果宽度多出 一个半径的时候,那么就按 图 d 那样放,每行管子数都是一样多的,如果不是,那么按图 c 那样两行交替的放,

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <string>
 5 #include <algorithm>
 6 #include <set>
 7 #include <vector>
 8 #include <map>
 9 #include <math.h>
10 #define _clr(a,val) (memset(a,val,sizeof(a)))
11 #define Max(x,y) (x) < (y) ? (y):(x)
12 #define Min(x,y) (x) < (y) ? (x):(y)
13 #define Mid(x,y) (((x) + (y)) >> 1)
14 
15 using namespace std;
16 const int inf = 100000007;
17 const double pi = sqrt(3.0) / 2.0;
18 const double eps = 1e-8;
19 
20 int main()
21 {
22     double a,b;
23     //int sum;
24     //freopen("data.txt","r",stdin);
25     while(scanf("%lf%lf",&a,&b) != EOF)
26     {
27         int sum1 = floor(a) * floor(b);
28         int sum2 = -1,sum3 = -1;
29         int temp = floor(b); 
30         int ttemp = floor((a - 1) / pi) + 1; // 计算层数
31         int kemp = floor(a);
32         int kkemp = floor((b - 1) / pi) + 1; 
33         if((int)(b * 10) % 10 >= 5)  // 如果多出 一个半径,那么就是按 图 d的方法放
34         {
35             sum2 = temp * ttemp;
36         }
37         else // 否则按图 c 的方法放
38         {
39             if(ttemp % 2) sum2 = (temp * 2 - 1) * (ttemp / 2) + temp;
40             else sum2 = (temp * 2 - 1) * (ttemp / 2);
41         }
42         if((int)(a * 10) % 10 > 5)  // b 是行数
43         {
44             sum3 = kemp * kkemp;
45         }
46         else
47         {
48             if(kkemp % 2) sum3 = (kemp * 2 - 1) * (kkemp / 2) + kemp;  
49             else sum3 = (kemp * 2 - 1) * (kkemp / 2);
50         }
51         int sum = sum1;
52         if(sum < sum2) sum = sum2;
53         if(sum < sum3) sum = sum3;
54         if(a - 1.0 < eps || b - 1.0 < eps)
55         sum = 0;
56         if(sum == sum1) printf("%d grid\n",sum);
57         else
58         printf("%d skew\n",sum);
59     }
60     return 0;
61 }
posted @ 2012-08-19 16:37  AC_Girl  阅读(203)  评论(0编辑  收藏  举报