做题总结——Delayed Work

做题总结——Delayed Work


原题
题目描述
题意分析:

这道题目是来计算最低的支付金额,该金额由工人的工资和罚款两部分组成。根据题意描述可知,工资的表达式:MX,罚款的表达式:(KP)/M,因此总金额表达式:MX+(KP)/M,这里K、P、X都是已知的,则该表达式变成了关于M的一个对勾函数,又因为M>0,则根据对勾函数的性质,当M=sqrt((KP)/X)时该表达式取得最小值,但是由于M必须是整数,所以可以在M分别是(int)sqrt((KP)/X)和(int)sqrt((K*P)/X)+1代入验证(可以根据函数图像,由于M必须是整数,所以比较离最小值点最近的两个整数,当然求出来的最小值点也可能恰好是整数,这样就多比较了一次,不过也没关系,哪能这么恰好QAQ),求出值更小的就是所求的最低支付金额

许多题目就是需要一些对应的数学知识,解决起来才能够游刃有余,所以先想要学号算法必须学好数学啊…

代码实现

#include<bits/stdc++.h>      //万能头文件
using namespace std;
int main()
{
    
    
    double k,p,x;
    cin>>k>>p>>x;
    //离最小值点最近的两个正整数
    int a=(int)sqrt((k*p)/x);      
    int b=a+1;
    double s1,s2;
    //分别代入计算两个整数点的值,也就是两个点对应的支付金额
    s1=((k*p)/a)+x*a;
    s2=((k*p)/b)+x*b;
    if(s1>s2)
    {
    
    
        printf("%.3lf\n",s2);
    }
    else
    {
    
    
        printf("%.3lf\n",s1);
    }
    //system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_46772594/article/details/107871569
今日推荐