hdu 5100 n*n棋盘放k*1长方条最多覆盖面积
生活随笔
收集整理的這篇文章主要介紹了
hdu 5100 n*n棋盘放k*1长方条最多覆盖面积
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://acm.hdu.edu.cn/showproblem.php?pid=5100
給一個n*n的棋盤,問用k*1的長方條最多能覆蓋多大的面積(k個單位都必須完全覆蓋上去)
首先,若n<k,則棋盤連一個1×k的矩形都放不下,輸出0。
我們只需要考慮n≥k的情況。將棋盤類似于黑白染色,按(i+j)模k劃分等價類,給每個格子標一個號。
標號之后,會注意到每條從左下到右上的斜線數字都是相同的,那么對于s×s的格子,其內部數字有且恰好有2s?1種,所以當s<=k2的時候,內部數字有floor(k2)?2?1<k種,所以不能有更佳的方案。
從而證明最優的方案一定是僅剩下一個s×s的正方形區域沒有被覆蓋到,其中s≤k/2。
而令l=n % k之后,根據l大小的不同,可以構造出中心為l×l或(k?l)×(k?l)的風車形圖案,又通過上面證明這個l(或k?l)就是之前的s,所以是最優的。
所以令l=n % k,如果l≤k2,最多可覆蓋的格子數即為n^2?l^2,否則為n^2?(k?l)^2,顯然這樣的方案是可以構造出來的(風車形)。
#include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <string> #include <queue> #include <map> #include <iostream> #include <algorithm> using namespace std; #define RD(x) scanf("%d",&x) #define RD2(x,y) scanf("%d%d",&x,&y) #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z) #define clr0(x) memset(x,0,sizeof(x)) #define clr1(x) memset(x,-1,sizeof(x)) #define eps 1e-9 const double pi = acos(-1.0); typedef long long LL; typedef unsigned long long ULL; const int modo = 1e9 + 7; const int INF = 0x3f3f3f3f; const int inf = 0x3fffffff; const LL _inf = 1e18; const int maxn = 55,maxm = 1<<12; int n,k; int main() {int _;RD(_);while(_--){RD2(n,k);int ans,r = n%k;if(n < k)ans = 0;else if(r <= k/2)ans = n*n - r*r;elseans = n*n - (k-r)*(k-r);//ans = n*n - (n - 2*(n%k))*(n - 2*(n%k));printf("%d\n",ans);}return 0; }
轉載于:https://www.cnblogs.com/zibaohun/p/4106650.html
總結
以上是生活随笔為你收集整理的hdu 5100 n*n棋盘放k*1长方条最多覆盖面积的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于androidManifest.xm
- 下一篇: iOS开发资源(持续更新)