鱼C论坛

 找回密码
 立即注册
查看: 2566|回复: 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行,每行一个整数,表示所对应的询问区间内的人数总和。
输入样例:
  1. 5 7
  2. 1 2 3 4 5 6 7
  3. 7 6 5 4 3 2 1
  4. 2 3 4 5 6 7 1
  5. 3 4 5 6 7 1 2
  6. 4 5 6 7 1 2 3
  7. 3
  8. 2 3 3 5
  9. 3 4 4 6
  10. 5 5 5 5
复制代码

输出样例:
  1. 27
  2. 32
  3. 1
复制代码


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

使用道具 举报

发表于 2021-10-17 12:41:29 | 显示全部楼层
1. 这题目不难吧
2. 样例中的第 9 行 "3 4 4 6" 是什么鬼?超范围了吧

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

  3. int main(void) {
  4.     size_t width, height; scanf("%lu%lu", &height, &width);
  5.     size_t *matrix = malloc(sizeof(*matrix) * width * height);
  6.     for(size_t y = 0; y < height; ++y) {
  7.         for(size_t x = 0; x < width; ++x) {
  8.             size_t temp; scanf("%lu", &temp);
  9.             matrix[y * width + x] = temp;
  10.         }
  11.     }
  12.     size_t q; scanf("%lu", &q);
  13.     size_t *area = malloc(sizeof(*area) * 4 * q);
  14.     for(size_t i = 0; i < q; ++i) {
  15.         for(size_t j = 0; j < 4; ++j) {
  16.             size_t temp; scanf("%lu", &temp);
  17.             area[i * 4 + j] = temp;
  18.         }
  19.     }
  20.     for(size_t i = 0; i < q; ++i) {
  21.         size_t l_x = area[i * 4 + 0] - 1;
  22.         size_t l_y = area[i * 4 + 1] - 1;
  23.         size_t r_x = area[i * 4 + 2] - 1;
  24.         size_t r_y = area[i * 4 + 3] - 1;
  25.         r_x = r_x < width ? r_x : width - 1;
  26.         r_y = r_y < height ? r_y : height - 1;
  27.         size_t sum = 0;
  28.         for(size_t y = l_y; y <= r_y; ++y) {
  29.             for(size_t x = l_x; x <= r_x; ++x) {
  30.                 sum += matrix[y * width + x];
  31.             }
  32.         }
  33.         printf("%lu\n", sum);
  34.     }
  35.     free(area); free(matrix);
  36.     return 0;
  37. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
  1. char arr[5][7]={
  2.                 {1,2,3,4,5,6,7},
  3.                 {7,6,5,4,3,2,1},
  4.                 {2,3,4,5,6,7,1},
  5.                 {3,4,5,6,7,1,2},
  6.                 {4,5,6,7,1,2,3}
  7.         };
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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 是错的
  1. $ ./main
  2. 5 7
  3. 1 2 3 4 5 6 7
  4. 7 6 5 4 3 2 1
  5. 2 3 4 5 6 7 1
  6. 3 4 5 6 7 1 2
  7. 4 5 6 7 1 2 3
  8. 3
  9. 2 3 3 5
  10. 3 4 4 6
  11. 5 5 5 5
  12. 27
  13. 24
  14. 1
  15. $
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
  1. #include <stdio.h>

  2. int main(){
  3.    
  4.     int n, m; // (1 < n, m <= 1000)
  5.     scanf("%d %d", &n, &m);
  6.     int shop[n][m];
  7.     for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) scanf("%d", &shop[i][j]);

  8.     int q; // (1 < q <= 10000)
  9.     scanf("%d", &q);
  10.    
  11.     long int answer[q];
  12.     int x1, y1, x2, y2; // x = row, y = column
  13.     for(int i = 0; i < q; i++){
  14.         scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
  15.         long int sum = 0;
  16.         for(int i = x1-1; i < x2; i++) for(int j = y1-1; j < y2; j++) sum += shop[i][j];
  17.         answer[i] = sum;
  18.     }
  19.    
  20.     for(int i = 0; i < q; i++) printf("%ld\n", answer[i]);

  21.     return 0;
  22. }
复制代码
  1. 5 7
  2. 1 2 3 4 5 6 7
  3. 7 6 5 4 3 2 1
  4. 2 3 4 5 6 7 1
  5. 3 4 5 6 7 1 2
  6. 4 5 6 7 1 2 3
  7. 3
  8. 2 3 3 5
  9. 3 4 4 6
  10. 5 5 5 5
  11. 27
  12. 32
  13. 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

嗯,我看了一下,反过来确实会输出
  1. 27
  2. 32
  3. 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 | 显示全部楼层
  1. char arr[5][7]={
  2.                 {1,2,3,4,5,6,7},
  3.                 {7,6,5,4,3,2,1},
  4.                 {2,3,4,5,6,7,1},
  5.                 {3,4,5,6,7,1,2},
  6.                 {4,5,6,7,1,2,3}
  7.         };

  8.         int sum=0,rlfttp=0,clfttp=0,rrhtbm=0,crhtbm=0,inputnum=0,i=0,j=0,m=0;
  9.         scanf("%d",&inputnum);
  10.         getchar();
  11.         int (*inputch)[4]=new int[inputnum][4];
  12.         m=0;
  13.         while (m<inputnum)
  14.         {
  15.                 scanf("%d %d %d %d",&inputch[m][0],&inputch[m][1],
  16.                         &inputch[m][2],&inputch[m][3]);
  17.                 getchar();
  18.                 m++;
  19.         }
  20.         for (m = 0; m < inputnum; m++)
  21.         {
  22.                 printf("%d %d %d %d\n",inputch[m][0],inputch[m][1],
  23.                         inputch[m][2],inputch[m][3]);
  24.         }
  25.         for (m = 0; m < inputnum; m++)
  26.         {
  27.                 sum=0;
  28.                 for (i = inputch[m][0]-1; i < inputch[m][2]; i++)
  29.                 {
  30.                         for (int j = inputch[m][1]-1; j < inputch[m][3]; j++)
  31.                         {
  32.                                 sum+=arr[i][j];
  33.                         }
  34.                 }
  35.                 printf("%d\n",sum);
  36.         }



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

使用道具 举报

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

  3. int a[1007][1007];

  4. int main()
  5. {
  6.     int n, m;
  7.     int q;
  8.     cin>>n>>m;
  9.     for (int i = 0; i < n; i++)
  10.     {
  11.         for (int j = 0; j < m; j++)
  12.         {
  13.             cin>>a[n][m];
  14.         }
  15.     }
  16.     cin>>q;
  17.     int xys[q][4];
  18.     for (int i = 0; i < q; i++)
  19.     {
  20.         for (int j = 0; j < 4; j++)
  21.         {
  22.             cin>>xys[i][j];
  23.         }
  24.     }

  25.     for (int i = 0; i < q; i++)
  26.     {
  27.         int x1 = xys[i][0] - 1, y1 = xys[i][1] - 1, x2 = xys[i][2] - 1, y2 = xys[i][3] - 1;
  28.         int sum = 0;
  29.         for (int j = x1; j <= x2; j++)
  30.         {
  31.             for (int k = y1; k <= y2; k++)
  32.             {
  33.                 sum += a[j][k];
  34.             }
  35.         }
  36.         cout<<sum<<endl;
  37.     }

  38.     return 0;
  39. }
复制代码

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 00:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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