鱼C论坛

 找回密码
 立即注册
查看: 3039|回复: 19

网格员的统计生活

[复制链接]
发表于 2021-10-17 10:56:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
编程作业求助:
题目:小 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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[y * width + x] = 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[i * 4 + j] = temp;
        }
    }
    for(size_t i = 0; i < q; ++i) {
        size_t l_x = area[i * 4 + 0] - 1;
        size_t l_y = area[i * 4 + 1] - 1;
        size_t r_x = area[i * 4 + 2] - 1;
        size_t r_y = area[i * 4 + 3] - 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[y * width + x];
            }
        }
        printf("%lu\n", sum);
    }
    free(area); free(matrix);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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列
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-17 13:27:45 | 显示全部楼层


5行7列,6是列
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-17 13:30:30 | 显示全部楼层

最后的这个 6 是行还是列,是 x 值还是 y 值?
最前面的 5 7,哪一个是行,哪一个是列,哪一个是 x 值,哪一个是 y 值?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-17 13:31:42 | 显示全部楼层
5 是行,7是列,对应二维数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-17 13:31:49 | 显示全部楼层

5 是 y,
7 是 x

最后面的 6 是 y
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-17 13:32:31 | 显示全部楼层
char arr[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}
        };
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-17 13:34:05 | 显示全部楼层

对呀,最后面的 6 是 y
y 最大就是 5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-17 13:36:04 | 显示全部楼层
人造人 发表于 2021-10-17 13:34
对呀,最后面的 6 是 y
y 最大就是 5


{3,4,5,6,7,1,2},
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-17 13:36:16 | 显示全部楼层

如果说我弄反了 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
$ 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[n][m];
    for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) scanf("%d", &shop[i][j]);

    int q; // (1 < q <= 10000)
    scanf("%d", &q);
    
    long int answer[q];
    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[i][j];
        answer[i] = sum;
    }
    
    for(int i = 0; i < q; i++) printf("%ld\n", answer[i]);

    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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 方向:从上向下

像下面这样
1.png

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-17 14:12:18 | 显示全部楼层
刚才我也蒙,按理来说 x 应该是列,y 应该是行才是,题目倒转了(可能题目 x 和 y 是以矩阵为位置吧,不是数学的坐标为位置)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-17 14:29:34 | 显示全部楼层
人造人 发表于 2021-10-17 13:53
嗯,我看了一下,反过来确实会输出

横为行,竖为列
所以5行7列
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-17 14:39:24 | 显示全部楼层
jhq999 发表于 2021-10-17 14:29
横为行,竖为列
所以5行7列

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

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

我就认为我的代码是对的,是题目错了,^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-17 15:26:42 | 显示全部楼层
char arr[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}
        };

        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)[4]=new int[inputnum][4];
        m=0;
        while (m<inputnum)
        {
                scanf("%d %d %d %d",&inputch[m][0],&inputch[m][1],
                        &inputch[m][2],&inputch[m][3]);
                getchar();
                m++;
        }
        for (m = 0; m < inputnum; m++)
        {
                printf("%d %d %d %d\n",inputch[m][0],inputch[m][1],
                        inputch[m][2],inputch[m][3]);
        }
        for (m = 0; m < inputnum; m++)
        {
                sum=0;
                for (i = inputch[m][0]-1; i < inputch[m][2]; i++)
                {
                        for (int j = inputch[m][1]-1; j < inputch[m][3]; j++)
                        {
                                sum+=arr[i][j];
                        }
                }
                printf("%d\n",sum);
        }



        delete[] inputch;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-22 18:54:31 | 显示全部楼层
#include <iostream>
using namespace std;

int a[1007][1007];

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[n][m];
        }
    }
    cin>>q;
    int xys[q][4];
    for (int i = 0; i < q; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            cin>>xys[i][j];
        }
    }

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

    return 0;
}
错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 17:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表