m0_66672208 2022-02-13 19:47 采纳率: 100%
浏览 35
已结题

3658小明统计数组

小明最近喜欢上数组统计,但是他遇到了一道难题,题目如下:

最初数列是空的,那么一共有下面五种操作:

  1. a x 表示向数列里面增加数值为x的数;

  2. d x 表示删除数列里面数值为x的数;

  3. I 表示删除数列里面数值最大的数;

  4. m 表示删除数列里面数值最小的数;

  5. q 询问当前数列的和。

保证添加的元素都不不一样,对于删除操作,如果数列里面不存在这个元素,则不进行删除操作。小明不会做这个题,希望寻求你的帮助,聪明的你可以帮助小明解决这个问题吗?

在处理输入的时候要特别注意!题目中操作 3 的操作字符是 大写的 i,而不是小写的 l。
输入格式
第一行输入两个数n,表示操作的数目; 之后n行,每行为题目中描述的五种操作。
输出格式
对于每个询问,输出当前数列的和。

  • 写回答

4条回答 默认 最新

  • 关注

    用数组作为数列,然后进行插入、删除、求和的操作就可以了。删除的时候是删除所有值为x的数吗?还是只删除最前面的?两种方式都写了函数,根据你自己的需要调用即可。代码如下:

    #include <iostream>
    using namespace std;
    
    //插入数据
    void insert(double a[],int &n,double x)
    {
        a[n] = x;
        n++;
    }
    //删除数为x的值,删除第一个x
    void del_1(double a[],int &n,double x)
    {
        int i,j;
        for (i=0;i<n;i++)
        {
            if(a[i]==x)
            {
                for (j = i;j<n-1;j++)
                {
                    a[j] = a[j+1];
                }
                n--;
                break;
            }
        }
    }
    
    //删除数为x的值,删除所有x
    void del_2(double a[],int &n,double x)
    {
        int i,j;
        for (i=0;i<n;i++)
        {
            if(a[i]==x)
            {
                for (j = i;j<n-1;j++)
                {
                    a[j] = a[j+1];
                }
                n--;
                i--;
            }
        }
    }
    
    //删除最大的数
    void delmax(double a[],int &n)
    {
        int index=0;
        for (int i = 1;i<n;i++)
        {
            if(a[i]>a[index])
                index = i;
        }
        //删除index位置的数
        for (int i=index;i<n-1;i++)
        {
            a[i] = a[i+1];
        }
        n--;
    }
    
    //删除最小的数
    void delmin(double a[],int &n)
    {
        int index=0;
        for (int i = 1;i<n;i++)
        {
            if(a[i]<a[index])
                index = i;
        }
        //删除index位置的数
        for (int i=index;i<n-1;i++)
        {
            a[i] = a[i+1];
        }
        n--;
    }
    
    //求和
    double sum(double a[],int n)
    {
        int s=0;
        for (int i=0;i<n;i++)
        {
            s+= a[i];
        }
        return s;
    }
    
    int main()
    {
        char op;
        int nmb = 0;
        double a[1000],x,max,min; //存储数据
        int n,i;
        cin >> n;
        getchar();
        for (i=0;i<n;i++)
        {
            cin >> op;
            switch(op)
            {
            case 'a':
                cin >> x;
                getchar();//接收回车符
                insert(a,nmb,x);
                break;
            case 'd':
                cin >> x;
                getchar();//接收回车符
                del_1(a,nmb,x); //删除第一个x,根据你的需要决定用哪一个
                //del_2(a,nmb,x); //删除所有x
                break;
            case 'I':
                delmax(a,nmb);//删除最大值
                break;
            case 'm':
                delmin(a,nmb); //删除最小值
                break;
            case 'q':
                cout << sum(a,nmb)<<endl; //输出和
                break;
            }
        }
    }
    
    

    如有帮助,请点击我的回答下方的“采纳该答案”帮忙采纳一下,谢谢。

    img

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

报告相同问题?

问题事件

  • 系统已结题 3月6日
  • 已采纳回答 2月26日
  • 创建了问题 2月13日

悬赏问题

  • ¥15 目详情-五一模拟赛详情页
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line