赛码-格子游戏

题目描述

有n个格子,从左到右放成一排,编号为1-n。

共有m次操作,有3种操作类型:

1.修改一个格子的权值,

2.求连续一段格子权值和,

3.求连续一段格子的最大值。

对于每个2、3操作输出你所求出的结果。

输入

 

输入第一行两个整数,n表示格子个数,m表示操作次数,n和m中间用空格隔开;

接下来输入n行,每行一个整数表示一个格子的权值

接下来输入m行,每行有三个整数,中间用空格隔开;第一个是选择的操作类型1-3,第二和第三个整数是操作格子的编号。

样例输入

 

3 3

7

8

9

2 1 3

3 1 3

2 1 2

输出

 

若执行1操作则无输出

若执行2和3操作则输出一个整数

样例输出

 

24

9

15

时间限制C/C++语言:2000MS其它语言:4000MS
内存限制C/C++语言:65536KB其它语言:589824KB

题目中没有提到操作1是咋样的输入格式,个人猜测:如1 2 6;将第2个格子的权值改为6。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace::std;

int a[1000],b[1000][3];

void change(int n)
{
    int num = b[n][2];
    a[num] = b[n][3];
}
int sum(int n)
{
    int num=0;
    for(int i = b[n][2];i<=b[n][3];i++)
    {
        num = num+a[i];
    }
    return num;
}
int max(int n)
{
    int m=a[b[n][2]];
    for(int i=b[n][2];i<=b[n][3];i++)
    {
        if(m<a[i])
        {
            m = a[i];
        }
    }
    return m;
    
}
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=3;j++)
        {
            scanf("%d",&b[i][j]);
        }
    }
    for(int i=1;i<=m;i++)
    {
        switch(b[i][1])
        {
        case 1:
            change(i);
            break;

        case 2:
            printf("%d
",sum(i));
            break;

        case 3:
            printf("%d
",max(i));
            break;
        }
    }
    return 0;
}

题目链接

原文地址:https://www.cnblogs.com/hdyss/p/10730595.html