问题 I: I

题目描述:

最近老陈家里买了台新式热水器,这台热水器开启后每隔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);
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43506138/article/details/87918356
I