CF1A Theatre Square
CF1A Theatre Square
知识点分类:数学
题目难度:易
codeforces地址: https://codeforces.com/problemset/problem/1/A
洛谷地址: https://www.luogu.com.cn/problem/CF1A
题目大意:
用 \(a \times a\) 的石板覆盖 \(n \times m\) 的矩形广场,允许石板覆盖的区域超出广场,不允许打破石板,石板的两侧应平行于广场两侧。
求:覆盖完广场所需的石板数量最少是多少。
输入:
3个正整数\(\ n,m,a\ (1 ≤ n, m, a ≤ 10^9)\)
输出:
1个正整数,所需的石板最少数量 \((注意数据范围,这是坑点之一)\)
题目分析:
这是一道典型的水题,只要将长和宽\((n,m)\)分别除以石板的边长\((a)\)并向上取整,再相乘即可。
题目本身没有难度,主要是向上取整的处理。
解题过程:
这里着重介绍 3 种常用的向上取整的技巧
1. 运用逻辑表达式
当 \(n\%a\neq0\) 时,\((n\%a!=0)\) 的返回值为 \(1(true)\),
而当\(n\%a=0\) 时,\((n\%a!=0)\) 的返回值为 \(0(false)\),
通过 整除结果 + 逻辑表达式的返回值 达到向上取整的效果#include <iostream> #include <cmath> using namespace std; int main() { int n,m,a; cin>>n>>m>>a; cout<<(long long)(n/a+(n%a!=0))*(m/a+(m%a!=0))<<endl; return 0; }2. 运用向上取整的性质
- \((被除数-1)/除数+1\)
(余数为0的那种情况的商减小了1,余数为其它值的商没变化)最后再+1就达到向上取整的效果了#include <iostream> #include <cmath> using namespace std; int main() { int n,m,a; cin>>n>>m>>a; cout<<(long long)((n-1)/a+1)*((m-1)/a+1)<<endl; return 0; }
- \((被除数+除数-1)/除数\)
所有余数不为0的被除数都有了再搏 1次的机会#include <iostream> #include <cmath> using namespace std; int main() { int n,m,a; cin>>n>>m>>a; cout<<(long long)((n+a-1)/a)*((m+a-1)/a)<<endl; return 0; }3. 运用C语言库函数 ceil 函数
另外:
- \(ceil(x)\) 返回不小于 \(x\) 的最小整数值
double ceil(double x)//原函数,返回值为double类型
- \(floor(x)\) 返回不大于 \(x\) 的最大整数值
double floor(double x)//原函数,返回值为double类型
- \(round(x)\) 返回 \(x\) 的四舍五入整数值
double round(double x)//原函数,返回值为double类型注意:(为什么要加 \(long\ long\))
- \(ceil\) 函数的原型为:\(double\ ceil(double\ x)\), 返回值为 \(double\) 类型
- \(double\)类型数据范围:\(-2^{1024}到2^{1024}\),也即\(-1.79\ast10^{308} 到1.79\ast10^{308}\)
- \(double\)类型数据特别大时会显示为科学计数法形式
#include <iostream> #include <cmath> using namespace std; int main() { int n,m,a; cin>>n>>m>>a; cout<<(long long)(ceil((double)n/a)*ceil((double)m/a))<<endl; return 0; }

浙公网安备 33010602011771号