题目大意:边长为a的正方形方块放入n*m的长方形广场,问最少多少可以覆盖整个广场(不能斜着放)
思想:先想到solve(n, m)=solve(n-a, m) + solve(n, m-a) - solve(n-a, m-a) + (n/a * m/a),但n、m都是109,因此肯定不行。不妨这样考虑:如果n或m不是a的倍数,放大到a的倍数不影响答案,因此最终答案=放大的n*放大的m/(a*a)。那怎么放大到a的倍数呢?放大的n = * a。
实现:纯粹是按题目要求思考,其实还可以这样想:n能放多少个a,m能放多少个a,两者乘积就是答案,这样想的代码更精简漂亮,详见代码2。
代码1:
#include<iostream>
#include<cmath>
#define LL long long
using namespace std;
LL n, m, a;
int main() {
scanf("%d%d%d", &n, &m, &a);
LL ans = 0;
if(n<=a && m<=a) {
ans = 1;
}else if(a==1) {
ans = 1LL*n*m;
}else{
if(n>a && n%a) {
n = 1LL*ceil(n/a+0.5) * a;
}
if(m>a && m%a) {
m = 1LL * ceil(m/a+0.5) * a;
}
ans = 1LL * (n*m)/(a*a);
}
printf("%lld\n", ans);
return 0;
}
代码2:
#include<iostream>
#include<cmath>
#define LL long long
using namespace std;
LL n, m, a;
LL ans;
int main() {
scanf("%d%d%d", &n, &m, &a);
LL c = n/a;
if(n%a) {
c+=1;
}
LL d = m/a;
if(m%a) {
d+=1;
}
printf("%lld\n", c*d);
return 0;
}
网友评论