64,642
社区成员
发帖
与我相关
我的任务
分享
m[n+1]//各点与起点的距离
p[n+1]// 各点利润
d[n+1]//用于存放建旅馆的点
f=0//总利润
pos=0//表示最近刚找到的建旅馆的点
index=0
d[index] = 0
p[0] = 0
for (i = 1; i <= n; i++)
{
//当第i点与前一个 建 旅馆的点的距离大于等于K时,这一点必选
if (m[i] - m[pos] >= k) {
d[++index] = i;
f = f+ p[i];
pos = i;
}
//当第i点与前一个 建 旅馆的点的距离小于K时,则比较此i点与前一个建 旅馆的点谁的 利润大
//建 利润大者
else if (p[i] > p[pos]) {
d[index] = i;
f = f-p[pos] + p[i];
pos = i;
}
#define N 128
int m[N];
float p[N];
double c[N];
int findCandidatePos(int begin, int dist) {
int end = N - 1;
dist += m[begin];
if (m[end] < dist) return N;
int mid = begin;
while (begin < end)
{
mid = (begin + end) / 2;
if (dist < m[mid])
{
end = mid - 1;
}
else if (m[mid] < dist)
{
begin = mid + 1;
}
else
{
break;
}
}
return (m[mid] < dist]) ? mid + 1 : mid;
}
double maxPrice(int curPos, int dist)
{
if (curPos == N) return 0.0;
if (c[curPos] > 0) return c[curPos];
double curMaxPric = 0.0;
int inputCurPos = curPos;
while (curPos < N)
{
int k = findCandidatePos(curPos, dist);
double kMaxPric = 0.0;
while (k < N)
{
double pk = maxPrice(k, dist);
if (pk > kMaxPric)
{
kMaxPric = pk;
}
k = findCandidatePos(k, dist);
}
kMaxPric += p[curPos];
if (kMaxPric > curMaxPric)
{
curMaxPric = kMaxPric;
}
++curPos;
}
c[inputCurPos] = curMaxPric;
return curMaxPric;
}
int i,p=p1,flag=m1;//p为总利润,flag标记上个旅馆距出发点的距离
for(i=2;i<=n;i++)
if(mi-flag>=k){p+=pi;flag=mi;}
int i,p=p1,used[n+1]={0},flag=m1;//p为总利润
for(i=2;i<=n;i++)
{
if(mi-flag>=k){p+=pi;flag=mi;}
}