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

来源:互联网 发布:餐厅记账软件 编辑:程序博客网 时间:2024/05/01 15:39
求教奥数题:张明骑自行车,速度为每小时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;
}
	
				
		
原创粉丝点击