传送门:题目
题意:
有n个蛋糕,每一个烤箱生产k个蛋糕需要花费t分钟,现在有1个烤箱,如果再拿一个烤箱过来需要花费d分钟,拿烤箱的时候也可以造蛋糕,就是互不耽误,问有没有必要拿第二个烤箱。
题解:
看到这种题目,一开始以为是模拟题,就用了两个for循环,第一个for模拟一个烤箱,第二个for模拟二个烤箱,最后比较时间大小,最后也AC了。
赛后看题解,头文件到return 0;一共两行,WTF?
发现这是一道思维题。
公式是:
d<n−1k∗t
d
<
n
−
1
k
∗
t
或者
d<(floor)nk∗t−t
d
<
(
f
l
o
o
r
)
n
k
∗
t
−
t
满足公式输出“YES”,不满足公式输出“NO”
两个公式都表示一个含义,第二个公式比较好理解,我们就看第二个:
nk∗t
n
k
∗
t
表示只用一个烤箱,所花费的时间,那么再减去一个t呢?
表示只用一个烤箱,最后一批,刚刚放入烤箱的时间。
如果第二个烤箱能够在最后一批开始之前,开始工作,那么第二个烤箱肯定能帮助最后一批提前完成。
关于第一个公式,其实是第二个公式的化简结果:
首先,我们要知道一个整数除法向上取整的数学定理(整数除法,向上取整,结论加证明。)
我们来化简一下
d<(floor)nk∗t−t
d
<
(
f
l
o
o
r
)
n
k
∗
t
−
t
:
(floor)nk∗t−t=(n−1k+1)∗t−t=n−1k∗t ( f l o o r ) n k ∗ t − t = ( n − 1 k + 1 ) ∗ t − t = n − 1 k ∗ t
公式一得证
我第一开始忘了向上整除,WA7.
AC代码:
#include <iostream>
int main(void){
int n,t,k,d;
std::cin>>n>>t>>k>>d;
int temp=n/k;
if(n%k!=0)
temp++;
puts(d<temp*t-t?"YES":"NO");
return 0;
}