题意抽象:
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 :
关于两点之间所有路径的方案