[NOIP模拟][好题]造盒子

来源:互联网 发布:bp神经网络算法步骤 编辑:程序博客网 时间:2024/06/05 09:37

题目描述:
企鹅豆豆收到了面积为 K 的一块橡皮泥。但是他没有合适的盒子来装下这个橡皮泥。所以他打算造一个盒子。
制造台是有方形网格的平台,每个小正方形边长为 1 。现在豆豆有两类木板,一类只能放在小正方形的边上,一类只能放在小正方形的对角线上。
现在豆豆想知道最少需要用多少块木板来制造一个封闭的盒子来把橡皮泥放下去。
输入格式:
第一行一个整数 T 表示数据组数。
对于每组数据的第一行一个整数 K ,表示橡皮泥的大小。
输出格式:
输出一个整数表示最少需要的木板数目
样例输入:
5
1
2
3
4
5
样例输出:
4
4
6
6
7
数据范围:
对于 50% 的数据,K20
对于 100% 的数据,K109
题目分析:
样例说明:k=5时这里写图片描述
这是一道规律题。如果能找到规律就十分简单了。
通过构图找规律:
因为同样是一块木板,对角线的木板明显更长,围成的面积也会更大,周长相同,越圆,面积越大。于是有当木板数i%4=0时,一个斜着放的正方形是最优的。如图:
这里写图片描述
i%4=1时,收到k=5的启发,我们向外拓展一个梯形。
这里写图片描述
i%4=2时,此时有两种想法,我们是从另外一边再扩展一个梯形,还是把原来的梯形扩展成一个长方形。如图,可以看出长方形是一个梯形的两倍多,所以选择长方形更优秀。
这里写图片描述
i%4=3时,此时当然是选择从最长边扩展出一个梯形。
这里写图片描述
图片来源:g19zwk的博客

我考试时并没有好好画图,而是奇葩地分析数据得出结论:

  • 块数   最大围住面积    与上一个差
  • 4    2
  • 5    2.5      0.5
  • 6    4       1.5
  • 7    5.5      1.5
  • 8    8
  • 9    9.5     1.5
  • 10   12      2.5
  • 11   14.5     2.5
  • 12  
    我们可以看出,i%4=0时,就是木板数除以4后的平方的两倍(相当于在计算一个正方形),而对于i%4=1是,就是比上一个多了i/4(整除)-0.5,i%4=2,i%4=3都是比上一个多了i/4+0.5。
    两种规律都可以求出答案。
    附代码:
    数据分析法代码:
#include<iostream>#include<cstring>#include<string>#include<cstdlib>#include<cstdio>#include<ctime>#include<iomanip>#include<cmath>#include<cctype>#include<algorithm>using namespace std;int po,t,k;double ans[100100];int readint(){    char ch;int i=0,f=1;    for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());    if(ch=='-') {ch=getchar();f=-1;}    for(;ch>='0'&&ch<='9';ch=getchar()) i=(i<<3)+(i<<1)+ch-'0';    return i*f;}int main(){    freopen("area.in","r",stdin);    freopen("area.out","w",stdout);    for(int i=4;i<=100000;i++)    {        po=i/4;        if(i%4==0) ans[i]=(i/4)*(i/4)*2;        else            if(i%4==1) ans[i]=ans[po*4]+po-0.5;            else ans[i]=ans[po*4+1]+(i-po*4-1)*(po+0.5);    }    t=readint();    while(t--)    {        k=readint();        for(int i=4;i<=100000;i++)            if(ans[i]>=k)            {                printf("%d\n",i);                break;              }    }    return 0;}

构图规律法:
此代码同样来源于:g19zwk

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<ctime>#include<cmath>#include<algorithm>#include<cctype>#include<iomanip>#include<queue>#include<set>using namespace std;int getint(){    int sum=0,f=1;    char ch;    for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());    if(ch=='-')    {        f=-1;        ch=getchar();    }    for(;isdigit(ch);ch=getchar())        sum=(sum<<3)+(sum<<1)+ch-48;    return sum*f;}int T,k;int s[92010];//因为询问是整数,所以省去了小数是没问题的int main(){    freopen("area.in","r",stdin);    freopen("area.out","w",stdout);    s[4]=2;    for(int i=5;i<=92000;++i)//预处理    {        if(i%4==0)            s[i]=(i/4)*(i/4)*2;        if(i%4==1)            s[i]=s[i-1]+((i-1)/4+(i-1)/4-1)/2;        if(i%4==2)            s[i]=s[i-2]+(i-2)/2;        if(i%4==3)            s[i]=s[i-1]+((i-3)/4+1+(i-3)/4)/2;    }    T=getint();    while(T--)//直接查询    {        k=getint();        for(int i=4;i<=92000;++i)            if(s[i]>=k)            {                cout<<i<<'\n';                break;            }    }    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 oppo云服务密码忘了怎么办 小米云内存满了怎么办 id储存空间满了怎么办 苹果手机邮箱服务器连接失败怎么办 苹果查看id闪退怎么办 域名卖出去后涉及赌博怎么办 发票认证后对方作废了怎么办 手机在屋里没信号怎么办 百度云上传文件和谐怎么办 收货地址写错了怎么办 阿里巴巴国际版出现加密令牌怎么办 淘宝寄货到转运仓拒收怎么办 淘宝已发货买家申请退货怎么办 买家给了一个差评不接电话怎么办 卖家单号填错了怎么办 拼多多虚假发货买家怎么办 买家退款后又收到货怎么办 买家确认收货已超时怎么办 淘宝买家不确认收货怎么办 买家快递单号填错怎么办 买家不确认收货不评价怎么办 淘宝不给改地址怎么办 淘宝快递发货后申请退款怎么办 摄影公司收钱后跑了怎么办 淘宝上申请退款卖家不处理怎么办 淘宝买东西商家发错货退回怎么办 假模特头头发毛燥怎么办 投资了网上融资平台被骗怎么办 微信被覆盖了怎么办 微信号被覆盖了怎么办 样品鞋子在灯光下变黄怎么办 美图秀秀拼图后发朋友圈模糊怎么办 手机重开淘宝网店怎么办 淘宝店铺下架了怎么办 淘宝东西下架了怎么办 淘宝衣服下架了怎么办 淘宝物品下架了怎么办 淘宝货品下架了怎么办 淘宝cmcc下架了怎么办 修手机主板被换怎么办 换手机屏幕被调换零件怎么办