Packets

Packets

给出若干个\(1\times 1,2\times2,...,6\times 6\)的正方形,数量各为\(a,b,c,d,e,f\),问最少的可以填进的\(6\times 6\)正方形。

首先\(6\times 6\)肯定只能独占一个正方形,\(ans+=f\),同样的\(5\times 5\)也必须独占一个正方形\(ans+=e\),但是\(5\times 5\)空出了一些位置可以给\(1\times 1\)的填,一个\(5\times 5\)有11个位置,所以\(a-=min(a,11e)\)

对于\(4\times 4\),显然空出了\(2\times 2\)可以填的位置,优先填\(2\times 2\),因为大的决策包含了小的决策,而\(4\times 4\)肯定需要独占一个正方形,所以\(ans+=d\),但值得注意的是,一个\(4\times 4\)可以有5个位置填给\(2\times 2\),显然需要\(temp=min(b,5d),b-=temp\),但是不一定所有的\(4\times 4\)都被\(2\times 2\)填满了,所以会留下一些位置给\(1\times 1\)填。

因为\(1\times 1\)即单位面积,于是我们只要算出剩下的面积即可,容易知道剩下的面积为\(temp=20d-4temp\),另\(a-=min(temp,a)\)即可。

\(3\times 3\)也是一个难点,首先\(3\times 3\)填满一个\(6\times 6\)需要4个,所以可以令\(ans+=\lceil c/3 \rceil\),接下来只要对余数部分讨论即可,令\(c\%=3\),容易知道剩下的位置优先填给\(2\times 2\),根据找规律,有可以填的2的数量为\(1+2(c-1)=2c-1\),接下来显然全部填给\(1\times 1\),令\(temp=min(b,2c-1)\),显然有\(b-=temp\),而\(a-=min(a,36-9c-4temp)\)

最后对于剩下的\(1\times 1\),而言,我们只要\(ans+=\lceil a/36 \rceil\)即可。

参考代码:

#include <iostream>
#include <cstdio>
#define il inline
#define ri register
using namespace std;
int main(){
	int a,b,c,d,e,f,temp;
	while(scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f),
		  a||b||c||d||e||f){
		int ans(f);
		ans+=e,a-=min(a,11*e);
		ans+=d,d*=5,temp=min(b,d),b-=temp,d-=temp,a-=min(d*4,a);
		ans+=(c+3)/4,c%=4;
		if(c)temp=min((3-c)*2+1,b),b-=temp,
				 a-=min(36-temp*4-c*9,a);
		ans+=(b+8)/9,b%=9;
		if(b)a-=min(a,36-b*4);
		ans+=(a+35)/36;
		printf("%d\n",ans);
	}
	return 0;
}
posted @ 2019-08-24 07:49  a1b3c7d9  阅读(424)  评论(0编辑  收藏  举报