程序员

CF - A. Theatre Square

2020-04-27  本文已影响0人  waaagh

题目大意:边长为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 = \lceil n/a \rceil * 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;
}
上一篇 下一篇

猜你喜欢

热点阅读