题目描述:
最近老陈家里买了台新式热水器,这台热水器开启后每隔k秒钟后自动保温,老陈每隔d秒钟来看一次,如果热水器进入保温状态,老陈会将重新将热水器重新开启,热水器中的水在加热状态下每秒钟获得2点热量,保温状态下获得1点热量,问多少秒后热水器中的水的热量会到达2*t(加热前水的热量为0)
输入
多组输入,每组数据包含三个正整数k、d、t(1<=k,d,t<=10^18)
输出
所需秒数(结果保留6位小数)
样例输入 Copy
3 2 6
样例输出 Copy
6.500000
分析:
本题是一个思维题,不过需要注意的细节较多。基本思路是求出一个周期的热量值,从而可以得出正确答案。
#include"stdio.h"
#include"string.h"
#include"algorithm"
using namespace std;
typedef long long ll;
int main()
{
double k,d,t;
while(~scanf("%lf%lf%lf",&k,&d,&t))
{
t=2*t;
if(k==d)
{
double cycle=2*k;
double second=0;
if(t>=cycle)
{
second=(ll)t/(ll)cycle*k;
}
second+=(ll)t%(ll)cycle/2.0;
printf("%0.6lf\n",second);
}
else
{
if(k>d&&(ll)k%(ll)d==0)
{
double cycle=2*k;
double second=0;
if(t>=cycle)
{
second=(ll)t/(ll)cycle*k;
}
second+=(ll)t%(ll)cycle/2.0;
printf("%.6lf\n",second);
}
else
{
double D=0;
if(k>d)
{
D=k+(d-(ll)k%(ll)d);
}
else
D=d;
double cycle=2*k+(D-k);
// printf("D=%0.0lf cycle=%.0lf\n",D,cycle);
double second=0;
if(t>=cycle)
{
second=(ll)t/(ll)cycle*D;
}
double MOD=(ll)t%(ll)cycle;
if(MOD<=2*k)
{
second+=(ll)MOD/2+((ll)MOD%2/2.0);
}
else
{
second+=k;
MOD-=2*k;
second+=MOD;
}
printf("%0.6lf\n",second);
}
}
}
}