数组左方的区域
求一个数组左方的所有区域的和以及平均数
第一种推荐算法:
超级无敌简单暴力法O(n)(最优解解法)
就是:
每一行单独计算,然后把每一行单独计算的值给累计起来就好,12行就写12个单独循环,最开始单独的两行还不用开循环,也就是只有10个循环
代码量也相对较少;
第二种方法:分块累加法
缺点:
- 边界条件容易出错
- 时间复杂度较大
- 有些边界到最后还是只能使用单独循环进行累加
- 边界条件不好处理
- 思维较复杂 代码量大
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
const int N=1000;
double a[N][N];
int main()
{
double tmp=0;
double tmp1=0;
double tmp2=0;
char mod;
cin>>mod;
for(int i=0;i<12;i++){
for(int j=0;j<12;j++){
cin>>a[i][j];
}
}
//int cnt=11;
int cnt1=1;
//神来之笔 可以把一个O(N3)的循环优化到O(n2) 通过能尽量判断有多少变量需要变而多少变量又可以同时变来,那些一定不能同时变来优化时间复杂度
while(cnt1<6) {
for (int j =0; j<cnt1; j++) {
tmp = tmp + a[cnt1][j];
}
//cnt--;
cnt1++;
}
for(int j=0;j<5;j++){
tmp1 = tmp1 + a[6][j];
}
int cnt2=4;
int cnt3=7;
while (cnt3<11){
for(int j=0;j<cnt2;j++){
tmp2=tmp2+a[cnt3][j];
}
cnt2--;
cnt3++;
}
if(mod=='S')printf("%.1f",tmp+tmp1+tmp2);
else printf("%.1f",(tmp+tmp1+tmp2)/30);
return 0;
}
所以有时候看似省事了,实际没有。
标签:int,左方,单独,区域,数组,double,include From: https://www.cnblogs.com/E-Sheep/p/16767779.html