Kid Phantom 2024-06-14 14:18 采纳率: 45.5%
浏览 2
已结题

c++取数问题找出错误

有n个数(2≤n≤100)排成一排,从n个数中任取若干个数,取数规则为每次取相邻的2个数,不能取1个,也不能取多于2个连续的数,找一种取法,使取到数的和为最大。
例如:n=6 6个数
13 2 17 14 8 16
取数方法有
13 2 14 8 和为 37
13 2 8 16 和为 39
2 17 8 16 和为 43
17 14 和为 37
其中和最大的为43
输入
第1行一个整数n,第2行n个整数x1 x2…….xn(1≤i≤100)
输出
一个整数,即合理取法中最大的和。
样例输入 Copy
6
12 7 8 14 9 13
样例输出 Copy
42

#include<bits/stdc++.h>
#define MX 100
using namespace std;
int a[MX + 10] = {0};
int main()
{
    int n,i,j,k,ans = 0,ma = INT_MIN;
    cin >> n;
    for (i = 1;i <= n;i++)
    {
        cin >> a[i];
    }
    for (i = 1;i < n;i++)
    {
        ans = 0;
        ans += a[i] + a[i + 1];
        for (j = i + 3;j <= n;)
        {
            if (j >= n)
            {
                break;
            }
            int p = 0,q = 0,mx = -1;
            if (ans + a[j] + a[j + 1] > ans)
            {
                for (k = j;k < n;k++)
                {
                    mx = max(mx,a[k] + a[k + 1]);
                }
                for (k = j;k < n;k++)
                {
                    if (a[k] + a[k + 1] == mx)
                    {
                        p = k;
                        q = p + 1;
                    }
                }
                if (p - 2 <= j)//最大值和a[j] + a[j + 1]不相容 
                {
                    ans += mx;
                    j = q + 2;
                }
                else//相容,那么以后再取最大值也不迟 
                {
                    ans += a[j] + a[j + 1];
                    j += 3;
                } 
            }
            else
            {
                j++;
            }
        }
        ma = max(ma,ans);
    }
    cout << ma << endl;
    return 0;
}
```c++
请直接找出错误,重写代码,不要换思路。

```

  • 写回答

4条回答 默认 最新

  • Kwan的解忧杂货铺 2024-06-14 14:20
    关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    程序的问题在于在取出每个数后没有处理它们与前两个数之间的差。这里需要将两者相加,并将其更新到累加器中。以下是修正后的代码:

    #include<iostream>
    #include<vector>
    
    using namespace std;
    
    int main()
    {
        int n, i, j, k, ans = 0, ma = INT_MIN;
        vector<int> a(n+1, 0);
    
        cin >> n;
        for (i = 1; i <= n; i++)
        {
            cin >> a[i];
        }
    
        for (i = 1; i < n; i++)
        {
            ans = 0;
            ans += a[i] + a[i + 1];
            for (j = i + 3; j <= n; j++)
            {
                if (j >= n)
                {
                    break;
                }
                int p = 0, q = 0, mmax = INT_MIN;
                if (ans + a[j] + a[j + 1] > ans)
                {
                    for (k = j;k < n;k++)
                    {
                        mmax = max(mmax, a[k] + a[k + 1]);
                    }
                    for (k = j;k < n;k++)
                    {
                        if (a[k] + a[k + 1] == mmax)
                        {
                            p = k;
                            q = p + 1;
                        }
                    }
                    if (p - 2 <= j)//最大值和a[j] + a[j + 1]不相容 
                    {
                        ans += mmax;
                        j = q + 2;
                    }
                    else//相容,那么以后再取最大值也不迟 
                    {
                        ans += a[j] + a[j + 1];
                        j += 3;
                    } 
                }
                else
                {
                    j++;
                }
            }
            ma = max(ma, ans);
        }
        cout << ma << endl;
        return 0;
    }
    

    注意我已经添加了对ans累加器初始化的部分,以确保每次取到最大值时能够得到正确的结果。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 6月22日
  • 已采纳回答 6月14日
  • 创建了问题 6月14日

悬赏问题

  • ¥15 请教如何关于Msg文件解析
  • ¥200 sqlite3数据库设置用户名和密码
  • ¥15 AutoDL无法使用docker install吗?
  • ¥15 cups交叉编译后移植到tina sdk的t113,只需要实现usb驱动打印机,打印pdf文件
  • ¥30 关于#wireshark#的问题:需要网络应用流量数据集需要做长度序列的实验,需要与应用产生的会话的数据包的长度,如视频类或者聊天类软件
  • ¥15 根据上述描述表示泥浆密度沿着管路的长度方向在不断变化,如何来表示泥浆密度随管路的变化(标签-matlab|关键词-流计算)
  • ¥21 matlab可以把图像数据转换为小波分析吗
  • ¥60 基于香农编码的图像压缩算法实现
  • ¥15 matlabGUI绘制一个函数与其导数的图像
  • ¥20 大数据采集用Python爬取猫眼电影数据