来自Vic_:http://blog.csdn.net/Vic___
每周一道算法题安慰自己竞赛的心,囧
1A 水题一道
原题地址:http://codeforces.com/problemset/problem/1/A
问题描述
题目理解
学点英语
Theatre Square 剧院广场
rectangular
adj. 矩形的;成直角的
shape
n. 形状;模型;身材;具体化
pave vt. 铺设;安排;作铺设之用
parallel n. 平行线;对比
pave vt. 铺设;安排;作铺设之用
parallel n. 平行线;对比
我的理解
题目是要在一个n*m矩形上用a*a的正方形,平行地完全覆盖,允许重叠,但不允许裁剪,求最少正方形数
看下列图解:
左边是n*m的被覆盖矩形,右边是用来覆盖的正方形
很容易想到一种解法,就是沿着每边铺完
左边就是覆盖的铺满了,但是难点在于不好确定怎么样去覆盖,怎么确定覆盖位置
所以,用到贪心算法思想,想到一个此时的最优解
贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。
左图就是这种铺法,可以得到同样结果
对此建模
很容易就能解出算法:
n/a向上取整 * m/a向上取整
解题代码
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main (){
double n, m ,a ;
cin>>n>>m>>a;
cout<<fixed<<setprecision(0)<<ceil(n/a)*ceil(m/a)<<endl;
return 0;
}
代码解释
第一次提交时候出现精度错误
果断包含iomanip文件
fixed定点格式输出
setprecision(0)设置精度为零
果断通过