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?
首先一张纸的四个点一定是不放在整数格点上最优,这个明显
只先讨论行的情况(列类似),由于格点可为实数,那么我们可以让上下两张纸之间的空隙为n−10−∞
懂?不懂就算了
所以把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);
}