(比賽回顧)廣工大2020級年ACM第一次月賽–Problem G: 秧歌Star不要上補習班

2020-10-19 11:00:55

題目

Description

Dio的兒子茸茸整天想要當秧歌Star,Dio眼看著他的成績下滑很焦灼。決定讓茸茸上Jo太郎老師開的補習班。Jo太郎聽聞茸茸的夢想之後很感動,對茸茸說如果你能夠在接下來的學習中答對全部t道題,我就送我以前當秧歌Star時候的帽子(戰損版)給你。
茸茸非常感激Jo太郎老師,他非常認真地學習了海洋學。
Jo太郎會給出一個n*m大小的二維的海圖,海圖中有k個生物體系,每個生物體系用一個數位表示。這q道題會給出4個值x1,x2,y1,y2
  茸茸需要計算(x1,y1),(x1,y2),(x2,y1),(x2,y2)這個矩形範圍內的數位和。

​ 你作為茸茸的替身是否能夠幫助茸茸解決這些題目呢?

Input

第一行輸入三個整數n,m,k,n*m(1<=n,m<=1000)表示海圖的大小,k(1<=k<=1000)表示海圖中生物體系的個數。

接下來k行,每行三個整數x,y,v,表示在(x,y)(1<=x<=n,1<=y<=m)的位置有生物體系v(1<=v<=1000)。

接下來一行輸入q(1<=q<=1000),表示有q道題目。

接下來q行,每行輸入四個整數,分別表示,x1,x2,y1,y2。其中(1<=x1,x2<=n,1<=y1,y2<=m)

Output

對於每道題目,在每行單獨輸出一個數表示這道題目的答案。

Sample Input

3 3 2
1 1 1
2 2 3
3
1 2 1 1
1 2 1 2
1 2 2 2

Sample Output

1
4
3

問題分析

兩個月沒寫c了突然看到這麼多字的題確實有點懵。但是!!看起來字很多,實際上理解題意後並不難。

首先看到二維海圖,馬上想到使用二維陣列。(動態申請經常忘記free,這裡直接按範圍給1000個)
此外,這裡還有一個生物體系數量剛剛好可以作為陣列每個元素的值(雖然剛開始我想到的是三維陣列)

那我們只需將二維陣列初始化每個元素為0,再按照座標所相應的地方賦值(生物體系數量)即可。

最後,由給定的兩個座標進行框定求和的二維陣列大小(需要注意的是這裡要先判斷x1,x2;y1,y2的大小,具體看你for迴圈怎麼寫),然後遍歷求和即可。

這裡列出思路框架:
1.二維陣列定義並初始化為0
2.根據輸入進行賦值
3.根據座標框定範圍
4.遍歷求和

AC程式碼

#include <stdio.h>

int main() {
    int n,m;
    int k;
    scanf("%d %d %d",&n,&m,&k);
    int x,y;
    int v[1000][1000]={0};
    //二維陣列定義並初始化為0
    for (int i = 0; i < k; ++i) {
        scanf("%d %d",&x,&y);
        scanf("%d",&v[x][y]);
        //根據輸入進行賦值
    }
    int q;
    scanf("%d",&q);
    for (int j = 0; j < q; ++j) {
        int x1,x2,y1,y2;
        scanf("%d %d %d %d",&x1,&x2,&y1,&y2);
        int tool=1;
        if(x1>x2){    //這裡做x還有y的比較
            tool=x1;  //是為了下面for迴圈做鋪墊
            x1=x2;
            x2=tool;
        }
        if(y1>y2){
            tool=y1;
            y1=y2;
            y2=tool;
        }
        int num=0;
        //根據座標框定範圍
        for (int z = x1; z <= x2; ++z) {
            for (int p = y1; p <= y2; ++p) {
                num+=v[z][p];
            }
        }
        //遍歷求和
        printf("%d\n",num);
    }
    return 0;
}