Twoo8 2016-07-10 15:42 采纳率: 50%
浏览 842

请教一个关于递归的问题

问题概述:连续P个方块,一共拿走Q个(指定具体哪几个),每次拿走一个(顺序任意),每拿走一个,与其能联通的盒子都返回1,
求拿走Q个后返回总数之和最小的值。
例:输入P=20,Q=3。输入三个数3,6,14。返回35.
我写的代码如下,

 #include<iostream>
using namespace std;
static int sum = 0;
void ff(int a[], int, int);
int main(){
    int p, q, x;
    cin >> p >> q;
    int *a = new int[p];
    int *b = new int[q];
    for (int i = 0; i < p; i++)
        a[i] = 0;
    for (int i = 0; i < q; i++)
    {
        cin >> x;
        a[x - 1] = 1;
    }
    ff(a, 0, p - 1);
    cout << sum << endl;
    return 0;
}
void ff(int a[],int left,int right){
    int r = right, l = left;
    int n = r - l+1;
    int mid = n / 2;
    int flag = 0, i = 0, x;
    if (l > r)return;
    while (mid - i>= l&&mid + i<= r){
        if (a[mid + i] == 1)
        {
            flag = 1;
            x = mid + i;
            break;
        }
        if (a[mid - i] == 1)
        {
            flag = 1;
            x = mid - i;
            break;
        }
        i++;
    }
    if (mid - i == l&&a[mid - i] == 1&&flag==0)
    {
        flag = 1;
        x = mid - i;
    }
    if (flag == 1)
    {
        sum += n - 1;
        ff(a, left, x - 1);             <--(1)
        ff(a, x + 1, right);          <--(2)
    }
    else return;
}

如果输入p=5,q=3。在输入1,3,5。
输出应为6。但是却输出了4.
经过单步调试,在(2)式第一次递归调用的时候,传入right为啥是1。应该传入3吧才合适,也就是说(1)式调用两次改变了本该出入(2)式的right……
请问各路大神是这样吗?应该怎么改呢……

  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2017-03-04 13:48
    关注
    评论

报告相同问题?

悬赏问题

  • ¥50 comsol稳态求解器 找不到解,奇异矩阵有1个空方程返回的解不收敛。没有返回所有参数步长;pid控制
  • ¥15 怎么让wx群机器人发送音乐
  • ¥15 fesafe材料库问题
  • ¥35 beats蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功