zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    从函数作用域和块级作用域看javascript的作用域链
    基于vue实现一个简单的MVVM框架(源码分析)
    发布-订阅模式
    希尔排序
    直接插入排序
    选择排序
    React Fiber源码分析 第三篇(异步状态)
    React Fiber源码分析 第二篇(同步模式)
    React Fiber源码分析 第一篇
    数据结构 之 树总结
  • 原文地址:https://www.cnblogs.com/a1b3c7d9/p/11403439.html
Copyright © 2011-2022 走看看