操作格子(C语言)

点点圈 提交于 2020-02-29 01:56:40

问题描述
有 n 个格子,从左到右放成一排,编号为 1-n。
共有 m 次操作,有 3 种操作类型:
1.修改一个格子的权值,
2.求连续一段格子权值和,
3.求连续一段格子的最大值。
对于每个 2、3 操作输出你所求出的结果。
输入格式
第一行 2 个整数 n,m。
接下来一行 n 个整数表示 n 个格子的初始权值。
接下来 m 行,每行 3 个整数 p,x,y,p 表示操作类型,p=1 时表示修改格子 x
的权值为 y,p=2 时表示求区间[x,y]内格子权值和,p=3 时表示求区间[x,y]内格子最大的
权值。
输出格式
有若干行,行数等于 p=2 或 3 的操作总数。
每行 1 个整数,对应了每个 p=2 或 3 操作的结果。
样例输入
4 3
1 2 3 4
2 1 3
1 4 3
3 1 4
样例输出
6
3

代码实现

#include<stdio.h>
void xiugai(int *a,int n,int x,int y)  //修改函数
{   
 for(int i=0;i<n;i++)
 {  
  if(a[i]==x)
   a[i]=y;
            break;
 }
}
void sum(int *a,int n,int x,int y)  //求和函数
{   int s=0;
    int b,c;
 for(int i=0;i<n;i++)
 {  
  if(a[i]==x)
   b=i;
  if(a[i]==y)
   c=i;
 }
 for(int j=b;j<=c;j++)
       s=s+a[j];
 printf("%d\n",s);
}
void max(int *a,int n,int x,int y)   //求最大值函数
{   
    int f,g;
 int m=-1;
 for(int i=0;i<n;i++)
 {  
  if(a[i]==x)
   f=i;
  if(a[i]==y)
   g=i;
 }
  
 for(int j=f;j<=g;j++)
 {
  if(a[j]>m)
   m=a[j];
 }
 printf("%d\n",m);
}
int main()
{  
 int a[100];
 int p[100],x[100],y[100];
 int n,m;
 printf("请输入:");
 scanf("%d%d",&n,&m);
 for(int i=0;i<n;i++)
 {   
  scanf("%d",&a[i]);
 }
 for(int j=0;j<m;j++)
 {   
  scanf("%d%d%d",&p[j],&x[j],&y[j]);
 } 
 for(int k=0;k<m;k++)
 {   
  if(p[k]==1)
   xiugai(a,n,x[k],y[k]);
  if(p[k]==2)
   sum(a,n,x[k],y[k]);
  if(p[k]==3)
   max(a,n,x[k],y[k]);
 }
 return 0;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!