菏澤做網(wǎng)站公司百度搜索引擎優(yōu)化詳解
最大子矩陣
描述
已知矩陣的大小定義為矩陣中所有元素的和。給定一個(gè)矩陣,你的任務(wù)是找到最大的非空(大小至少是1*1)子矩陣。
比如,如下4*4的矩陣
0- 2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0-2
的最大子矩陣是
9 2
-4 1
-18
這個(gè)子矩陣的大小是15。
輸入輸入是一個(gè)N*N的矩陣。輸入的第一行給出N(0<N<=100)。再后面的若干行中,依次(首先從左到右給出第一行的N個(gè)整數(shù),再?gòu)淖蟮接医o出第二行的N個(gè)整數(shù)…)給出矩陣中的N2個(gè)整數(shù),整數(shù)之間由空白字符分隔(空格或者空行)。已知矩陣中整數(shù)的范圍都在[-127,127]。
輸出
輸出最大子矩陣的大小。
樣例輸入
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
樣例輸出
15
#include <iostream>
using namespace std;
int main()
{int n;cin>>n;int a[110][110] = {0};int b[110][110] = {0};for(int i = 1;i<=n;i++){for(int j = 1;j<=n;j++){cin>>a[i][j];if(i==1){b[i][j] = b[i][j-1]+a[i][j];}else{b[i][j] = b[i-1][j]+a[i][j]+b[i][j-1]-b[i-1][j-1];}}}int cnt = 0;int ma = -99999;for(int i1 = 1;i1<=n-1;i1++){for(int j1 = 1;j1<=n-1;j1++){for(int i2 = i1+1;i2<=n;i2++){for(int j2 = j1+1;j2<=n;j2++){if(i1==1&&j1==1){cnt = b[i2][j2];}else if(i1!=1&&j1==1){cnt = b[i2][j2]-b[i1-1][j2];}else if(i1==1&&j1!=1){cnt = b[i2][j2]-b[i2][j1-1];}else if(i1!=1&&j1!=1){cnt = b[i2][j2]-b[i2][j1-1]-b[i2][j1-1]+b[i1-1][j1-1];}ma = max(cnt,ma);}}}}cout<<ma;return 0;
}
均分紙牌
題目描述
有n堆紙牌(2<n≤200),排成一行,編號(hào)分別為1,2....n。已知每堆紙牌有一定的張數(shù),且張數(shù)之和均為n的倍數(shù)。移動(dòng)各堆中的任意張紙牌,使每堆的數(shù)量達(dá)到相同,且移動(dòng)次數(shù)最少。
移動(dòng)規(guī)則:每次可以移動(dòng)任意的張數(shù),第1堆可以移向第2堆第2堆可以移向第1堆或第3堆,。第n堆只可以移向第n-1堆。
例如,當(dāng)n=4時(shí):
堆號(hào)1 2 3 4
張數(shù)3 5 4 8
移動(dòng)的方法有許多種,其中的一種方案:
① 第2堆向第1堆移動(dòng)2張,成為:5 3 4 8
②第4堆向第3堆移動(dòng)3張,成為:5 3 7 5
③第3堆向第2堆移動(dòng)2張,成為:5 5 5 5
經(jīng)過三次移動(dòng),每堆都成為5張。
輸入
第一行一個(gè)整數(shù)n。
第二行n個(gè)整數(shù),用空格分隔。
輸出
1個(gè)整數(shù)(表示最少移動(dòng)次數(shù))
樣例
輸入復(fù)制
4
3 5 4 8
輸出復(fù)制
2
#include <iostream>
using namespace std;
int main()
{int n;cin>>n;int a[210] = {0};int sum = 0;for(int i = 0;i<n;i++){cin>>a[i];sum = sum+a[i];}sum = sum/n;int cnt = 0;for(int i = 0;i<n;i++){if(a[i]<sum){a[i+1] = a[i+1]-(sum-a[i]);a[i] = sum;cnt++;}else if(a[i]>sum){a[i+1] = a[i+1]+a[i]-sum;a[i] = sum;cnt++;}}cout<<cnt;return 0;
}