#10971: TLE 1s 這題有何好方法像前一題先建表?


vagrantlike (丫維)

學校 : 不指定學校
編號 : 27614
來源 : [114.24.87.102]
最後登入時間 :
2020-01-23 17:45:52
a694. 吞食天地二 | From: [163.29.253.102] | 發表日期 : 2016-05-30 13:20

這題是二維矩陣 但想不到好方法如第一題般先建表?有高手可以提供方向嘛?

naive 的作法吃了TLE...

/////////////////////////////////////////////////////////////

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int baozudu[500+1][500+1]= {0};

int main(int argc,char* argv[]) {
    int i=0,j=0,k=0,n=0,m=0,x1=0,y1=0,x2=0,y2=0,sum=0;

    while(scanf("%d %d",&n,&m)!=EOF) {

        memset(baozudu,0,sizeof(baozudu));

        for(i=0; i<n; ++i) {
            for(j=0; j<n; ++j) {
                scanf("%d",&baozudu[i][j]);

            }
        }

        for(k=0; k<m; ++k) {

            sum=0,x1=0,y1=0,x2=0,y2=0;
            scanf("%d %d %d %d",&x1,&y1,&x2,&y2);;
            for(i=x1-1; i<=x2-1; ++i) {
                for(j=y1-1; j<=y2-1; ++j) {
                    sum+=baozudu[i][j];
                }
            }
            printf("%d\n",sum);

        }
    }

    return 0;
}

 
#10976: Re:TLE 1s 這題有何好方法像前一題先建表?


justinO__o (夜貓)

學校 : 臺北市立成功高級中學
編號 : 51052
來源 : [111.71.212.14]
最後登入時間 :
2024-09-22 17:57:48
a694. 吞食天地二 | From: [175.182.130.222] | 發表日期 : 2016-05-31 23:10

這題是二維矩陣 但想不到好方法如第一題般先建表?有高手可以提供方向嘛?

naive 的作法吃了TLE...

/////////////////////////////////////////////////////////////

#include
#include
#include


int baozudu[500+1][500+1]= {0};

int main(int argc,char* argv[]) {
    int i=0,j=0,k=0,n=0,m=0,x1=0,y1=0,x2=0,y2=0,sum=0;

    while(scanf("%d %d",&n,&m)!=EOF) {

        memset(baozudu,0,sizeof(baozudu));

        for(i=0; i<n; ++i) {
            for(j=0; j<n; ++j) {
                scanf("%d",&baozudu[i][j]);

            }
        }

        for(k=0; k<m; ++k) {

            sum=0,x1=0,y1=0,x2=0,y2=0;
            scanf("%d %d %d %d",&x1,&y1,&x2,&y2);;
            for(i=x1-1; i<=x2-1; ++i) {
                for(j=y1-1; j<=y2-1; ++j) {
                    sum+=baozudu[i][j];
                }
            }
            printf("%d\n",sum);

        }
    }

    return 0;
}

baozudu[第i行][第i行從第一個數加到第j個數的和]


 
#15790: Re:TLE 1s 這題有何好方法像前一題先建表?


10555088@mail.hpsh.tp.edu.tw (3.141592653589793238462)

學校 : 不指定學校
編號 : 70904
來源 : [210.71.78.245]
最後登入時間 :
2020-05-04 15:39:14
a694. 吞食天地二 | From: [1.171.153.50] | 發表日期 : 2018-10-31 22:32

這題是二維矩陣 但想不到好方法如第一題般先建表?有高手可以提供方向嘛?

naive 的作法吃了TLE...

/////////////////////////////////////////////////////////////

#include
#include
#include


int baozudu[500+1][500+1]= {0};

int main(int argc,char* argv[]) {
    int i=0,j=0,k=0,n=0,m=0,x1=0,y1=0,x2=0,y2=0,sum=0;

    while(scanf("%d %d",&n,&m)!=EOF) {

        memset(baozudu,0,sizeof(baozudu));

        for(i=0; i<n; ++i) {
            for(j=0; j<n; ++j) {
                scanf("%d",&baozudu[i][j]);

            }
        }

        for(k=0; k<m; ++k) {

            sum=0,x1=0,y1=0,x2=0,y2=0;
            scanf("%d %d %d %d",&x1,&y1,&x2,&y2);;
            for(i=x1-1; i<=x2-1; ++i) {
                for(j=y1-1; j<=y2-1; ++j) {
                    sum+=baozudu[i][j];
                }
            }
            printf("%d\n",sum);

        }
    }

    return 0;
}

//答案如下:


#include <stdio.h>

int main(){

    int m,n,i,j,x1,x2,y1,y2,a;

 

    while(scanf("%d%d",&n,&m)!=EOF){

        int A[n][n],B[n][n];

        for(i=0;i<n;i++){

            for(j=0;j<n;j++){

            scanf("%d",&A[i][j]);

            if(i==0&&j==0){

                B[0][0]=A[0][0];

            }

            else if(i==0){

                B[0][j]=A[0][j]+B[0][j-1];

            }

            else if(j==0){

                B[i][0]=A[i][0]+B[i-1][0];

            }

            else{

                B[i][j]=B[i-1][j]+B[i][j-1]-B[i-1][j-1]+A[i][j];

            }

            }

        }

        for(i=0;i<m;i++){

            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);

            a=B[x2-1][y2-1];

            if(x1!=1){a-=B[x1-2][y2-1];}

            if(y1!=1){a-=B[x2-1][y1-2];}

            if(x1!=1&&y1!=1){a+=B[x1-2][y1-2];}

            printf("%d\n",a);

        }

    }

 

    return 0;

}

//(1,1)(1,2)(1,3)(1,4)

//(2,1)(2,2)(2,3)(2,4)

//(3,1)(3,2)(3,3)(3,4)

//(4,1)(4,2)(4,3)(4,4)

//(2,2)加到(4,4)=>>>(1,1)加到(4,4)-(1,1)加到(4,1)-(1,1)加到(1,4)+(1,1)

//用這樣解

 
ZeroJudge Forum