题解 P6546 【[COCI2010-2011#2] PUŽ】
Utilokasteinn · · 题解
大水题,但是还是错了一次,半分钟打出一个暴力求解,结果TLE了5个点,代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int v,a,b,s=0;
cin>>a>>b>>v;
for(int i=1;s+=a;i++,s-=b)
if(s>=v)cout<<i,exit(0);
}
然而正解是O(1)输出,当然TLE。
很容易发现,如果直接将v/(a-b)会出错。因为如果白天已经到了,就不用往下滑了。所以,先将高度减去一个白天上升的高度,然后再除以a-b的差,如果有余数,就要天数就要+1,或者直接用ceil函数(向上取整),最后还有加上刚开始减去的那个白天,也就是天数+1,所以得出的公式是ceil(1.0*(v-a)/(a-b))+1,但是,由于ceil返回的数是浮点数,所以最后还有强制类型转换。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,v;
cin>>a>>b>>v;
cout<<int(ceil(1.0*(v-a)/(a-b))+1);
return 0;
}
谢谢观赏。