weixin_39115868 2019-09-07 12:36 采纳率: 33.3%
浏览 369
已结题

求问这道编程题是哪里出错了,生日礼物?

描述
ftiasch 18岁生日的时候,lqp18_31给她看了一个神奇的序列 A1, A2, ..., AN. 她被允许选择不超过 M 个连续的部分作为自己的生日礼物。

自然地,ftiasch想要知道选择元素之和的最大值。你能帮助她吗?

输入
第1行,两个整数 N (1 ≤ N ≤ 105) 和 M (0 ≤ M ≤ 105), 序列的长度和可以选择的部分。

第2行, N 个整数 A1, A2, ..., AN (0 ≤ |Ai| ≤ 104), 序列。

输出
一个整数,最大的和。

样例输入
5 2
2 -3 2 -1 2
样例输出
5

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

void paixu(int c[100000][3],int j){
     for(int i = 0;i < j;i++){
        for(int k = i + 1;k <= j;k++){
            if(c[i][0] > c[k][0]){
                int x = c[i][0];
                c[i][0] = c[k][0];
                c[k][0] = x;
                x = c[i][1];
                c[i][1] = c[k][1];
                c[k][1] = x;
                x = c[i][2];
                c[i][2] = c[k][2];
                c[k][2] = x;
            } 
        }
    }
}
int main(){
    int n,m;
    cin >> n >> m;
    int a[100000];
    int b[100000];
    int c[100000][3];
    int j = 0;
    int zheng = 0,fu = 0;
    int zhenghe = 0;
    for(int i = 0;i < n;i++){
        b[i] = 0;
    } 
    for(int i = 0;i < n;i++){
        cin >> a[i];
        if(a[i] * b[j] >= 0){
            b[j] += a[i];
        }
        else{
            j++;
            b[j] += a[i];
        }
    }
    for(int i = 0;i <= j;i++){
        if(b[i] >= 0){
            zheng++;
            zhenghe += b[i];
        }
    }
    for(int i = 0;i <= j;i++){
            c[i][0] = abs(b[i]);
            c[i][1] = i;
            if(b[i] >= 0)  c[i][2] = 1;
            else c[i][2] = 0;
    }
    int h = j;
    int qq = 0;
    while(1){
        paixu(c,h);
        if(zheng <= m){
            cout << zhenghe << endl;
            return 0;
        }
        else{
            if(c[qq][2] == 1){
                zheng--;
                zhenghe = zhenghe - c[qq][0];
            }
            else if(c[qq][2] == 0){
                if(c[qq][1] == 0 || c[qq][1] == h){
                    qq += 1;
                }
                else{
                    zheng--;
                    zhenghe -= c[qq][0];
                    c[qq][0] = c[qq][0] + c[c[qq][1] - 1][0] + c[c[qq][1] + 1][0];
                    for(int i = c[qq][1] - 1;i <= h;i++){
                        c[i][0] = c[i + 1][0];
                        c[i][1] = c[i + 1][1];
                        c[i][2] = c[i + 1][2];
                    }
                    for(int i = c[qq][1] + 1;i <= h;i++){
                        c[i][0] = c[i + 1][0];
                        c[i][1] = c[i + 1][1];
                        c[i][2] = c[i + 1][2];
                    }
                    h--;
                }
            }
        }

    } 
    return 0;
}
  • 写回答

3条回答 默认 最新

  • Tiarnach 2019-09-07 16:36
    关注

    描述看错,原回答已删除

    评论

报告相同问题?

悬赏问题

  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条