JZOJsenior5536.【2014东莞市选】游戏

本文探讨了一种关于纸片覆盖的游戏问题,通过分析纸片放置的最优策略,给出了计算最少纸片数量的方法,并附带了C语言实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

problem

Description

    小H是个喜欢思考的人,因此也很乐于挑战各种思考题目。今天,他的朋友小L来找他玩,同时小L还带来了一个简单的游戏,小L给出一张划分为W × H的单元格的纸,接着告诉小H,现在要求小H用w × h的纸片(不允许旋转)放在纸上,问小H最多能在纸上放多少张纸片,使得任何两张纸片都没有重叠部分。
   当然这个简单的问题很快就被小H解决了,现在喜欢思考小H想到了另一个游戏,就是让小L来放纸片,但是要求小L放最少的纸片,使得小H连再放多一张纸片的空间都没有。


图1为最优放置方法,图2为不允许的放置方法(因为还可以再放置一个),图3为允许但不是最优的放置方法
小H为了让问题变得有趣,要求小L放置的纸片必须平行于纸的边缘,同时纸片放置的位置可以在实数点上,但是不能超出纸面。

Input

输入文件包含四个整数W,H,w,,h分别为纸面的长、宽,纸片的长宽,w<=W, h<=H.

Output

输出一个数字表示最少可以放置的满足要求的数量

Sample Input

Sample 1
11 4 3 2

Sample 2
10 8 3 4

Sample 3
15 7 4 2

Sample Output

Sample 1
2

Sample 2
2

Sample 3
4

Data Constraint

70%的数据W<=100,H<=100
100%的数据W<=30000,H<=30000


analysis

  • 其实很简单,一张n×m的纸片实际能盖住2n×2m的空间

  • why?

  • 首先一张纸的四个点一定是不放在整数格点上最优,这个明显

  • 只先讨论行的情况(列类似),由于格点可为实数,那么我们可以让上下两张纸之间的空隙为n10

  • 懂?不懂就算了

  • 所以把N×M的纸先塞满2n×2m的纸片,剩下再有空间就再插入一行或一列的纸片


code

#include<stdio.h>

using namespace std;

int N,M,n,m;

int main()
{
    freopen("game.in","r",stdin);
    freopen("game.out","w",stdout);
    scanf("%d%d%d%d",&N,&M,&n,&m);
    int t1=N/(2*n),t2=M/(2*m);
    if (N%(2*n)>=n)t1++;
    if (M%(2*m)>=m)t2++;
    printf("%d\n",t1*t2);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值