【hdu5100】棋盘覆盖

http://acm.hdu.edu.cn/showproblem.php?pid=5100

题目大意:

用1*k的木块铺n*n的棋盘,求多铺满多少个单位格。

方法:

n < k,显然无解;n >= 2 * k,总可以转换成n - k的情况,因为那一部分总可以铺满,于是最终可以转换成n < 2 * k 情况,这种情况下有两种不同的方式铺,一种是一行行铺,还一种是旋转铺,推推公式就行了。

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <map>
 7 #include <vector>
 8 #include <stack>
 9 #include <string>
10 #include <ctime>
11 #include <queue>
12 #define mem0(a) memset(a, 0, sizeof(a))
13 #define mem(a, b) memset(a, b, sizeof(a))
14 #define lson l, m, rt << 1
15 #define rson m + 1, r, rt << 1 | 1
16 #define eps 0.0000001
17 #define lowbit(x) ((x) & -(x))
18 #define memc(a, b) memcpy(a, b, sizeof(b))
19 #define x_x(a) ((a) * (a))
20 #define LL long long
21 #define DB double
22 #define pi 3.14159265359
23 #define MD 10000007
24 #define INF (int)1e9
25 #define max(a, b) ((a) > (b)? (a) : (b))
26 using namespace std;
27 
28 int main()
29 {
30         //freopen("input.txt", "r", stdin);
31         //freopen("output.txt", "w", stdout);
32         int T;
33         cin>> T;
34         while(T--) {
35                 int n, k;
36                 scanf("%d%d", &n, &k);
37                 int nn = n;
38                 if(nn >= k) {
39                         nn = nn % k + k;
40                         int tmp = min(2 * k - nn, nn - k);
41                         printf("%d\n", n * n - tmp * tmp);
42                 }
43                 else printf("0\n");
44         }
45         return 0;
46 }
View Code

 

posted @ 2014-11-13 16:09  jklongint  阅读(227)  评论(0编辑  收藏  举报