问题描述
有 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<iostream>
using namespace std;
void fz(int a[],int n,int x,int y)//赋值
{
int i;
for(i=0;i<n;i++)
{
if(a[i]==x)
{
a[i]=y;
break;
}
}
}
void sum(int a[],int n,int x,int y)
{
int c,b,i,sum=0;
for(i=0;i<=n;i++)
{
if(a[i]==x)
c=i;
if(a[i]==y)
b=i;
}
for(i=c;i<=b;i++)
sum+=a[i];
cout<<sum<<endl;;
}
void compare(int a[],int n,int x,int y)
{
int max=-1,i;
for(i=0;i<n;i++)
if(max<a[i])
max=a[i];
cout<<max<<endl;
}
int main()
{
int n,m,i;
int a[100];//保存初始的权值
int p[100],x[100],y[100];//方便一次输入m行
cin>>n>>m;
for(i=0;i<n;i++)
cin>>a[i];
for(i=0;i<m;i++)
cin>>p[i]>>x[i]>>y[i];
for(i=0;i<m;i++)
{
if(p[i]==1)
fz(a,n,x[i],y[i]);
if(p[i]==2)
sum(a,n,x[i],y[i]);
if(p[i]==3)
compare(a,n,x[i],y[i]);
}
return 0;
}
本质:利用函数调用来实现各个功能,充分体现设计模块化的原则。