【我会的都很简单】递归的应用

题意抽象:

10000个位置中,有许多位置有灯,刚开始的时候 灯都是开的,从一个起始未知开始,每秒向坐或是向右前进一个位置,把灯熄灭,每秒灯的功率是一瓦,求熄灭所有灯所需要的最少功率

分析:

基本的公式为:

time+=接连熄灭的两盏灯间的距离;

sum+=time

问题的关键在于,从起始位置开始,向左走要是向右走。人类最原始而不经过思考的第一直觉是:每次选择与当前位置距离最近的点。这么一试,5个case 满足了4个。。后来发现 ,这真是个没有思考的解法。

正确的方案是,判断一下,往哪个方向走,sum 值比较大。

伪代码如下:

// 假设一共N盏灯,起始位置为S

int d[N+1];// d[1]=2 表示2号位置有盏灯

int process(int data[], int start, int timmer,int sum){

if(start == 1){

//hit left side bound

for each i>=2

if(data[i] != 0){

timmer +=distance;//distance between last light and this light;

sum+=timmer;

}

return sum;

}else if(start == N+1 ){

//hit right side bound

//same with left side;

}

//havn't reach either bound now.

data[start]=0;// set start point to visited;

int left_index,right_index; the first light left/right to start

int left_result=sum+(d[start]-d[left])+process(data,left,timmer+(d[start]-d[left]),sum+(d[start]-d[left]));

// if go left , sum should inculde current sum,and the time from start to left ,and the minium of time start from left point

int right_result=sum + (d[right] - d[start] ) + process( data, right, timmer + (d[right] - d[start]) , sum+d[right]-d[start]);

return left_result > right_result?right_result : left_result;


}


WHATS' MORE:

递归超时----  T_T

TODO :

关于两点之间所有路径的方案


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值