一道数学题。
这题我居然写了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++.