操作格子---算法集

问题描述
有 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
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;
}

本质:利用函数调用来实现各个功能,充分体现设计模块化的原则。

你可能感兴趣的:(算法(含数据结构)笔记,#,算法竞赛,算法)