hdu 5100 Chessboard

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

在比赛时没看懂题就没看,结束之后,看了解题报告才知道怎么做。

解题报告:

首先,若n<k,则棋盘连一个1×k的矩形都放不下,输出0。
我们只需要考虑n≥k的情况。将棋盘类似于黑白染色,按(i+j)模k划分等价类,给每个格子标一个号。
标号之后,会注意到每条从左下到右上的斜线数字都是相同的,那么对于s×s的格子,其内部数字有且恰好有2s−1种,所以当s<=k2的时候,内部数字有floor(k2)∗2−1<k种,所以不能有更佳的方案。
从而证明最优的方案一定是仅剩下一个s×s的正方形区域没有被覆盖到,其中s≤k2。
而令l=n mod k之后,根据l大小的不同,可以构造出中心为l×l或(k−l)×(k−l)的风车形图案,又通过上面证明这个l(或k−l)就是之前的s,所以是最优的。
所以令l=n mod k,如果l≤k2,最多可覆盖的格子数即为n2−l2,否则为n2−(k−l)2,显然这样的方案是可以构造出来的(风车形)。

这个题的一个论文:http://www.matrix67.com/blog/archives/5900

 1 #include<stdio.h>
 2
 3 int main()
 4 {
 5     int t,n,k;
 6     while(scanf("%d",&t)!=EOF)
 7     {
 8         while(t--)
 9         {
10             scanf("%d%d",&n,&k);
11             if(n<k)
12             {
13                 printf("0\n");
14             }
15             else
16             {
17                 int x=n%k;
18                 if(x<=k/2)
19                 {
20                     printf("%d\n",n*n-x*x);
21                 }
22                 else
23                 {
24                     printf("%d\n",n*n-(k-x)*(k-x));
25                 }
26             }
27         }
28     }
29     return 0;
30 }

 
时间: 2024-10-29 19:08:03

hdu 5100 Chessboard的相关文章

HDU 5100 Chessboard 用 k &amp;#215; 1 的矩形覆盖 n &amp;#215; n 的正方形棋盘

pid=5100">点击打开链接 Chessboard Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 335    Accepted Submission(s): 168 Problem Description Consider the problem of tiling an n×n chessboard by polyomi

HDU 5100 Chessboard 用 k &#215; 1 的矩形覆盖 n &#215; n 的正方形棋盘

点击打开链接 Chessboard Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 335    Accepted Submission(s): 168 Problem Description Consider the problem of tiling an n×n chessboard by polyomino pieces tha

hdu 5100 Chessboard (额,,,,,就叫它趣味数学题吧)

题意: 用K*1的砖块去覆盖N*N的大矩形,问最多能覆盖多少块. 详细证明:(转载自matrix67) Matrix67: The Aha Moments 趣题:用 k × 1 的矩形覆盖 n × n 的正方形棋盘 用 k × 1 的小矩形覆盖一个 n × n 的正方形棋盘,往往不能实现完全覆盖(比如,有时候 n × n 甚至根本就不是 k 的整倍数).不过,在众多覆盖方案中,总有一种覆盖方案会让没有覆盖到的方格个数达到最少,我们就用 m(n, k) 来表示这个数目.求证:不管 n 和 k 是多

HDU 2414 Chessboard Dance (强行模拟)

题目链接:HDU 2414 Chessboard Dance 题意:给出一张图,>,<,^,v表示人面对的方向,字母相当于是箱子,箱子可以推出边界,人保证不会做出边界,下面输入指令,按照指令走,输出结束时图的状态: 强行模拟一遍,注意下面给出的案例. >t.p.p.p ...a.... ........ ...bfg.y ...c... ...d.... ...e.... ........ move 3 turn right move 3 turn left move 3 turn le

HDU 1838 Chessboard

dp[i][j]表示以(i,j)为右下角所含棋盘的最大规模, 如果 s[i][j] == s[i-1][j-1] && s[i][j] != s[i-1][j] && s[i][j] != s[i][j-1]      dp[i][j] = min( dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1 否则dp[i][j] = 1 1 //#define LOCAL 2 #include <iostream> 3 #include

BestCoder17 1001.Chessboard(hdu 5100) 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5100 题目意思:有一个 n * n 的棋盘,需要用 k * 1 的瓷砖去覆盖,问最大覆盖面积是多少. 比赛时不会做............. hdu 题解: 首先,若n<k,则棋盘连一个1×k的矩形都放不下,输出0. 我们只需要考虑n≥k的情况.将棋盘类似于黑白染色,按(i+j)模k划分等价类,给每个格子标一个号. 标号之后,会注意到每条从左下到右上的斜线数字都是相同的,那么对于s×s的格子,其内部

POJ 3344 &amp; HDU 2414 Chessboard Dance(模拟)

题目链接: PKU:http://poj.org/problem?id=3344 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=2414 Description Another boring Friday afternoon, Betty the Beetle thinks how to amuse herself. She goes out of her hiding place to take a walk around the living r

POJ 3344 &amp;amp; HDU 2414 Chessboard Dance(模拟)

题目链接: PKU:http://poj.org/problem? id=3344 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=2414 Description Another boring Friday afternoon, Betty the Beetle thinks how to amuse herself. She goes out of her hiding place to take a walk around the living

HDOJ 5100 Chessboard 构造

MATRIX67大神:   http://www.matrix67.com/blog/archives/5900 Chessboard Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 538    Accepted Submission(s): 241 Problem Description Consider the problem o