p3299 简单题两种解法

        最近在图书馆借了本书,名字叫做《数据结构编程实验--大学生程序设计课程与竞赛训练教材》,这本书唯一的好处就是给POJ的题目分类了下,从简单题开始,到运用各种算法的题目,这样,至少给了我一个循序渐进的过程。

        言归正传,题目poj3299,难点在于算dewpoint的那个过程。书上给出的方法繁琐,效率低下,不过是一个很好的借鉴。其想法就是二分查找方法的一个变形,叫减半递推技术。减半”是指将问题的规模减半,而问题的性质不变; “递推”是指重复“减半”的过程。这里的减半递推也就是设定一个增量值,每次循环增量值减小一半,不断去向正确答案靠近。说得不清楚,想说一下:

        首先,我们知道了temp值和hum值,求dew值,这里假设初始的露点dew值为0,然后进入循环:
        dew值增量从100开始,以后每次循环减半。根据公式,求出hum值hum1
                  1.如果hum1大于给定的hum,则dew值减少一个增量
                  2.如果hum1小于给定的hum,则dew值增加一个增量
        循环直到组后的增量值小于0.00012为止,此时得到dew值的近似值。

主要代码如下:

double calc_dew(){ //temp 温度temperature,hum humidex
    double x = 0;        //初始的dew值
    double delta=100;   //增量值

    for (){
        if (calc_hum(temp,x) > hum) x-= delta; //hum1与hum比较
        else x += delta;
    }
    return x;
}
当然了,更简单的方法就是推导下dew的求值公式,更直接,效率也高。

void calc_dew(){
    double e;
    
    e = 10.0+(hum-temp)/0.5555;
    dew = 1/(1/273.16-(log(e/6.11)/5417.7530))-273.16;
};
哎,可悲我还在做这么简单的题目~

你可能感兴趣的:(poj,pku,JudgeOnline,p3299)