zoukankan      html  css  js  c++  java
  • 求教奥数题:张明骑自行车,速度为每小时14千米,王华骑摩托车,速度为每小时35千米,他们分别从A、B两地出发,并在两地之间不断往返行驶,且两人第四次相遇(两人同时到达同一地点叫做相遇)与第五次相遇的地

    求教奥数题:张明骑自行车,速度为每小时14千米,王华骑摩托车,速度为每小时35千米,他们分别从A、B两地出发,并在两地之间不断往返行驶,且两人第四次相遇(两人同时到达同一地点叫做相遇)与第五次相遇的地点恰好相距120千米,那么,A、B两地只见的距离是多少千米?
    
    
    图解:相遇和追击其实都是函数的交点(这小学学过?)
    
    
    
    
    
    
    
    程序员解:
    #include <iostream>
    #include <iomanip> 

    using namespace std;

    //speedA>=speedB
    int speedA = 35;
    int speedB = 14;

    struct TEncounter
    {
    double encounterPercent;
    int directionA;//1 right -1 left
    int directionB;
    };

    TEncounter GetnexTEncounter(int n,TEncounter lastEncounter)
    {
    TEncounter nexTEncounter;
    if (n == 0)
    {
    //第一次遭遇
    nexTEncounter.encounterPercent = 1.0f*speedA/(speedA+speedB);
    nexTEncounter.directionA = 1;
    nexTEncounter.directionB = -1;
    return nexTEncounter;
    }
    if (lastEncounter.directionA == 1 && lastEncounter.directionB == 1)
    {
    //都往右,追是追不上了,堵
    nexTEncounter.encounterPercent = lastEncounter.encounterPercent + (1 - lastEncounter.encounterPercent)*2*speedB/(speedA+speedB);
    nexTEncounter.directionA = -1;
    nexTEncounter.directionB = 1;
    }
    else if (lastEncounter.directionA == -1 && lastEncounter.directionB == -1)
    {
    //都往左,跟都往又一样
    nexTEncounter.encounterPercent = lastEncounter.encounterPercent - lastEncounter.encounterPercent*2*speedB/(speedA+speedB);
    nexTEncounter.directionA = 1;
    nexTEncounter.directionB = -1;
    }
    else if (lastEncounter.directionA == -1 && lastEncounter.directionB == 1)
    {
    if ((1-lastEncounter.encounterPercent)/speedB > (1+lastEncounter.encounterPercent)/speedA)
    {
    //追上了
    nexTEncounter.encounterPercent = lastEncounter.encounterPercent + 2*lastEncounter.encounterPercent*speedB/(speedA-speedB);
    nexTEncounter.directionA = 1;
    nexTEncounter.directionB = 1; 
    }
    else
    {
    //追不上就堵
    nexTEncounter.encounterPercent = 1 - (2.0f/(speedA+speedB)-(1-lastEncounter.encounterPercent)/speedB)*speedB;
    nexTEncounter.directionA = 1;
    nexTEncounter.directionB = -1;
    }
    }
    else if (lastEncounter.directionA == 1 && lastEncounter.directionB == -1)
    {
    if (lastEncounter.encounterPercent/speedB > (2-lastEncounter.encounterPercent)/speedA)
    {
    //追
    nexTEncounter.encounterPercent = lastEncounter.encounterPercent - 2*(1-lastEncounter.encounterPercent)*speedB/(speedA-speedB);
    nexTEncounter.directionA = -1;
    nexTEncounter.directionB = -1;
    }
    else
    {
    ////追不上,堵
    nexTEncounter.encounterPercent = lastEncounter.encounterPercent - (2.0f/(speedA+speedB)-(1-lastEncounter.encounterPercent)*2/speedA)*speedA;
    nexTEncounter.directionA = -1;
    nexTEncounter.directionB = 1;
    }
    }
    if (nexTEncounter.encounterPercent == 1 && lastEncounter.encounterPercent == 1)
    {
    //终极遭遇
    return GetnexTEncounter(n,nexTEncounter);
    }
    return nexTEncounter;
    }

    int main()
    {
    cout.setf(ios::fixed);
    TEncounter encounter[20];
    encounter[0] = GetnexTEncounter(0,encounter[0]);
    for (int i = 1; i < 20; i++)
    {
    encounter[i] = GetnexTEncounter(i,encounter[i-1]);
    }
    for (int i = 0; i < 20; i++)
    {
    cout<<setprecision(4)<<encounter[i].encounterPercent<<"\tA direction:"<<encounter[i].directionA<<"\tB direction:"<<encounter[i].directionB<<endl;
    }
    cout<<endl<<"AB="<<120.0f/(encounter[4].encounterPercent - encounter[3].encounterPercent)<<endl;
    return 0;
    }
    
    
  • 相关阅读:
    我的技术移民之路(一)移,还是不移
    【新消息】 请问签证和护照有什么区别啊?_爱问知识人
    Australia Visa Information China Chinese Visa Types
    HqBaiduMusic百度音乐高品质下载Chrome扩展
    分享:一个支持并发, 支持异步/同步, 支持http/https, 支持续传的avhttp库
    linux世界里类似source insight的工具(zz)如梦初醒中国教育人博客
    分享:Fix8 0.7.0 发布,C++ 金融信息交换协议实现
    我的技术移民之路(一)移,还是不移
    转:javascript null和undefined 区别
    javascript Frame和IFrame
  • 原文地址:https://www.cnblogs.com/marryZhan/p/2213908.html
Copyright © 2011-2022 走看看