問題描述
有 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;
}
本質:利用函數調用來實現各個功能,充分體現設計模塊化的原則。