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;
}
posted @ 2021-03-09 20:53  Wegoon  阅读(142)  评论(0)    收藏  举报