题目: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 }