题解 P6546 【[COCI2010-2011#2] PUŽ】

· · 题解

大水题,但是还是错了一次,半分钟打出一个暴力求解,结果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;
}

谢谢观赏。