冰清玉洁丸 发表于 2021-10-17 10:56:07

网格员的统计生活

编程作业求助:
题目:小 Q 是一个商场的网格员,他的片区是一个n×m的方格,每个格子是一家商铺,商铺里有若干营业员,小 Q 的老板是一个特别细致而且啰嗦的人,他经常要问小 Q 很多无意义的问题。你瞧,他又来了,他要考察小 Q 是否是一个精干的网格员,因此他要对片区内任意矩形区间的总人数进行提问,小 Q 可不是普通的网格员,他业余时间学习了二维前缀和算法,可以轻松应对老板的数十万次的疯狂提问。想想,如果换成是你来做网格员,你会被老板炒鱿鱼吗?
输入:第一行两个整数n,m (1<n,m≤1000)。接着连续n行,每行m个整数,均不超过 100,整数之间以一个空格隔开,每个整数表示对应位置的商铺里的人数。接着一行,一个整数q(1<q≤10^5)。然后连续q行,每行4个整数x1,y1,x2,y2,整数之间以一个空格隔开,分别代表一个矩阵的左上角(x1,y1)和右下角(x2,y2)。
输出:输出共q行,每行一个整数,表示所对应的询问区间内的人数总和。
输入样例:5 7
1 2 3 4 5 6 7
7 6 5 4 3 2 1
2 3 4 5 6 7 1
3 4 5 6 7 1 2
4 5 6 7 1 2 3
3
2 3 3 5
3 4 4 6
5 5 5 5

输出样例:27
32
1


{:10_277:}

人造人 发表于 2021-10-17 12:41:29

1. 这题目不难吧
2. 样例中的第 9 行 "3 4 4 6" 是什么鬼?超范围了吧

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

int main(void) {
    size_t width, height; scanf("%lu%lu", &height, &width);
    size_t *matrix = malloc(sizeof(*matrix) * width * height);
    for(size_t y = 0; y < height; ++y) {
      for(size_t x = 0; x < width; ++x) {
            size_t temp; scanf("%lu", &temp);
            matrix = temp;
      }
    }
    size_t q; scanf("%lu", &q);
    size_t *area = malloc(sizeof(*area) * 4 * q);
    for(size_t i = 0; i < q; ++i) {
      for(size_t j = 0; j < 4; ++j) {
            size_t temp; scanf("%lu", &temp);
            area = temp;
      }
    }
    for(size_t i = 0; i < q; ++i) {
      size_t l_x = area - 1;
      size_t l_y = area - 1;
      size_t r_x = area - 1;
      size_t r_y = area - 1;
      r_x = r_x < width ? r_x : width - 1;
      r_y = r_y < height ? r_y : height - 1;
      size_t sum = 0;
      for(size_t y = l_y; y <= r_y; ++y) {
            for(size_t x = l_x; x <= r_x; ++x) {
                sum += matrix;
            }
      }
      printf("%lu\n", sum);
    }
    free(area); free(matrix);
    return 0;
}

jhq999 发表于 2021-10-17 13:14:07

本帖最后由 jhq999 于 2021-10-17 13:20 编辑

人造人 发表于 2021-10-17 12:41
1. 这题目不难吧
2. 样例中的第 9 行 "3 4 4 6" 是什么鬼?超范围了吧
2、怎么超范围了?左上角3、4右下角4、6;从1开始3行和4行,4、5、6列

人造人 发表于 2021-10-17 13:26:40

jhq999 发表于 2021-10-17 13:14
2、怎么超范围了?左上角3、4右下角4、6;从1开始3行和4行,4、5、6列

3 4 4 6

x1 = 3
y1 = 4
x2 = 4
y2 = 6

一共就 5 行

我的那个程序可以输出 27 和 1,但是中间输出的不是 32

jhq999 发表于 2021-10-17 13:27:45

人造人 发表于 2021-10-17 13:26
3 4 4 6

x1 = 3


5行7列,6是列

人造人 发表于 2021-10-17 13:30:30

jhq999 发表于 2021-10-17 13:27
5行7列

最后的这个 6 是行还是列,是 x 值还是 y 值?
最前面的 5 7,哪一个是行,哪一个是列,哪一个是 x 值,哪一个是 y 值?

jhq999 发表于 2021-10-17 13:31:42

5 是行,7是列,对应二维数组

人造人 发表于 2021-10-17 13:31:49

jhq999 发表于 2021-10-17 13:27
5行7列,6是列

5 是 y,
7 是 x

最后面的 6 是 y

jhq999 发表于 2021-10-17 13:32:31

人造人 发表于 2021-10-17 13:31
5 是 y,
7 是 x



char arr={
                {1,2,3,4,5,6,7},
                {7,6,5,4,3,2,1},
                {2,3,4,5,6,7,1},
                {3,4,5,6,7,1,2},
                {4,5,6,7,1,2,3}
        };

人造人 发表于 2021-10-17 13:34:05

jhq999 发表于 2021-10-17 13:32


对呀,最后面的 6 是 y
y 最大就是 5

jhq999 发表于 2021-10-17 13:36:04

人造人 发表于 2021-10-17 13:34
对呀,最后面的 6 是 y
y 最大就是 5

{3,4,5,6,7,1,2},

人造人 发表于 2021-10-17 13:36:16

jhq999 发表于 2021-10-17 13:32


如果说我弄反了 x 和 y,这个输出结果怎么解释
只有一个 24 是错的
$ ./main
5 7
1 2 3 4 5 6 7
7 6 5 4 3 2 1
2 3 4 5 6 7 1
3 4 5 6 7 1 2
4 5 6 7 1 2 3
3
2 3 3 5
3 4 4 6
5 5 5 5
27
24
1
$

jhq999 发表于 2021-10-17 13:40:33

人造人 发表于 2021-10-17 13:36
如果说我弄反了 x 和 y,这个输出结果怎么解释
只有一个 24 是错的

(3,4)=5,(3,5)=6,(3,6)=7
(4,4)=6 (4,5)=7   (4,6)=1
5+6+7+6+7+1=32

傻眼貓咪 发表于 2021-10-17 13:47:01

#include <stdio.h>

int main(){
   
    int n, m; // (1 < n, m <= 1000)
    scanf("%d %d", &n, &m);
    int shop;
    for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) scanf("%d", &shop);

    int q; // (1 < q <= 10000)
    scanf("%d", &q);
   
    long int answer;
    int x1, y1, x2, y2; // x = row, y = column
    for(int i = 0; i < q; i++){
      scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
      long int sum = 0;
      for(int i = x1-1; i < x2; i++) for(int j = y1-1; j < y2; j++) sum += shop;
      answer = sum;
    }
   
    for(int i = 0; i < q; i++) printf("%ld\n", answer);

    return 0;
}5 7
1 2 3 4 5 6 7
7 6 5 4 3 2 1
2 3 4 5 6 7 1
3 4 5 6 7 1 2
4 5 6 7 1 2 3
3
2 3 3 5
3 4 4 6
5 5 5 5
27
32
1

人造人 发表于 2021-10-17 13:53:49

jhq999 发表于 2021-10-17 13:40
(3,4)=5,(3,5)=6,(3,6)=7
(4,4)=6 (4,5)=7   (4,6)=1
5+6+7+6+7+1=32

嗯,我看了一下,反过来确实会输出
27
32
1


但是还是有问题
题目是这样的
然后连续q行,每行4个整数x1,y1,x2,y2,整数之间以一个空格隔开,分别代表一个矩阵的左上角(x1,y1)和右下角(x2,y2)。

如果输入 3 4 4 6
那么
x1 = 3
y1 = 4
x2 = 4
y2 = 6

现在的问题是 x 方向是哪个方向?y 方向是哪个方向?
题目上也没说
我理解的是
x 方向:从左向右
y 方向:从上向下

像下面这样


傻眼貓咪 发表于 2021-10-17 14:12:18

刚才我也蒙,按理来说 x 应该是列,y 应该是行才是,题目倒转了(可能题目 x 和 y 是以矩阵为位置吧,不是数学的坐标为位置)

jhq999 发表于 2021-10-17 14:29:34

人造人 发表于 2021-10-17 13:53
嗯,我看了一下,反过来确实会输出




横为行,竖为列
所以5行7列

人造人 发表于 2021-10-17 14:39:24

jhq999 发表于 2021-10-17 14:29
横为行,竖为列
所以5行7列

对于这个题目来说
x 方向是 竖向
y 方向是 横向

我没见过这样的,除了在这里
如果没有官方的定义,我就不承认这一点
x 方向是 竖向
y 方向是 横向

我就认为我的代码是对的,是题目错了,^_^

jhq999 发表于 2021-10-17 15:26:42

char arr={
                {1,2,3,4,5,6,7},
                {7,6,5,4,3,2,1},
                {2,3,4,5,6,7,1},
                {3,4,5,6,7,1,2},
                {4,5,6,7,1,2,3}
        };

        int sum=0,rlfttp=0,clfttp=0,rrhtbm=0,crhtbm=0,inputnum=0,i=0,j=0,m=0;
        scanf("%d",&inputnum);
        getchar();
        int (*inputch)=new int;
        m=0;
        while (m<inputnum)
        {
                scanf("%d %d %d %d",&inputch,&inputch,
                        &inputch,&inputch);
                getchar();
                m++;
        }
        for (m = 0; m < inputnum; m++)
        {
                printf("%d %d %d %d\n",inputch,inputch,
                        inputch,inputch);
        }
        for (m = 0; m < inputnum; m++)
        {
                sum=0;
                for (i = inputch-1; i < inputch; i++)
                {
                        for (int j = inputch-1; j < inputch; j++)
                        {
                                sum+=arr;
                        }
                }
                printf("%d\n",sum);
        }



        delete[] inputch;

冰清玉洁丸 发表于 2021-10-22 18:54:31

#include <iostream>
using namespace std;

int a;

int main()
{
    int n, m;
    int q;
    cin>>n>>m;
    for (int i = 0; i < n; i++)
    {
      for (int j = 0; j < m; j++)
      {
            cin>>a;
      }
    }
    cin>>q;
    int xys;
    for (int i = 0; i < q; i++)
    {
      for (int j = 0; j < 4; j++)
      {
            cin>>xys;
      }
    }

    for (int i = 0; i < q; i++)
    {
      int x1 = xys - 1, y1 = xys - 1, x2 = xys - 1, y2 = xys - 1;
      int sum = 0;
      for (int j = x1; j <= x2; j++)
      {
            for (int k = y1; k <= y2; k++)
            {
                sum += a;
            }
      }
      cout<<sum<<endl;
    }

    return 0;
}
错了{:10_277:}
页: [1]
查看完整版本: 网格员的统计生活