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
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器