CF1A Theatre Square

一道数学题。
这题我居然写了20min。我太弱了。。
好了,看这道题之前,我们先学一个函数:cmath库里头的ceil函数,作用是向上取整,和floor就是反过来。
进入正文:
读读题,只要是个人都能想到n*m/a*a这做法吧,手动模拟一下:嗯,答案没错。
然后写上了CF1A的第一个代码。
Code:

#include<iostream>
#include<cmath>
#define ll long long
using namespace std;
int n,m,a;
int main(){
    cin>>n>>m>>a;
    cout<<ceil((m*n)/(a*a));
    return 0;
}

等等!怎么答案少个2?
那我乘上个2好了。
Code:

#include<iostream>
#include<cmath>
#define ll long long
using namespace std;
int n,m,a;
int main(){
    cin>>n>>m>>a;
    cout<<2*ceil((m*n)/(a*a));
    return 0;
}

然后妥妥WA了。
方法不对?那我们来加加减减看看能不能得到样例。我们首先把n=m=6,a=4带入,发现好像((m+1)/(a-1))+((n+1)/(a-1))这个式子符合答案诶。
舒服!
Code:

#include<iostream>
#include<cmath>
#define ll long long
using namespace std;
int n,m,a;
int main(){
    cin>>n>>m>>a;
    cout<<ceil(((m+1)/(a-1))+((n+1)/(a-1)));
    return 0;
}

交上去你会发现你RE了..
别急,让我们再考虑一下最初的做法。没啥不对吧?
除数是a,那么我们想一个问题:(n*m)/(a*a)不就等价于(n/a)(m/a)吗!
带入这个式子,再想想C++的某些东西。除数是个a,显然要用实数来解决这个a啊。好的!解决了吧!
Code:

#include<iostream>
#include<cmath>
#define ll long long
using namespace std;
ll n,m,a;
int main(){
    cin>>n>>m>>a;
    cout<<(ceil(n/(double)a)*ceil(m/(double)a));
    return 0;
}

又WA了..?
让我们看看怎么回事..输出了1e18??显然是实数的锅锅。
Code:(AC)

#include<iostream>
#include<cmath>
#define ll long long
using namespace std;
ll n,m,a;
int main(){
    cin>>n>>m>>a;
    cout<<(long long)(ceil(n/(double)a)*ceil(m/(double)a));
    return 0;
}

本来这就是个入门难度的题,发这些上来只是为了巩固一下C++基础和一些奇奇怪怪的想法罢了。
NOIP 2018 RP++.

posted @ 2018-10-22 23:19  kenlig  阅读(286)  评论(1编辑  收藏  举报