• 欢迎光临~

数组左方的区域

开发技术 开发技术 2022-10-07 次浏览

数组左方的区域

求一个数组左方的所有区域的和以及平均数
数组左方的区域

第一种推荐算法:

超级无敌简单暴力法O(n)(最优解解法)
就是:
每一行单独计算,然后把每一行单独计算的值给累计起来就好,12行就写12个单独循环,最开始单独的两行还不用开循环,也就是只有10个循环
代码量也相对较少;

第二种方法:分块累加法

缺点:

  1. 边界条件容易出错
  2. 时间复杂度较大
  3. 有些边界到最后还是只能使用单独循环进行累加
  4. 边界条件不好处理
  5. 思维较复杂 代码量大
#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;
}

所以有时候看似省事了,实际没有。

程序员灯塔
转载请注明原文链接:数组左方的区域
喜欢 (0)