Packets

Packets

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

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

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

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

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

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

参考代码:

#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
",ans);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/a1b3c7d9/p/11403439.html