网格员的统计生活
编程作业求助:题目:小 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:} 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:20 编辑
人造人 发表于 2021-10-17 12:41
1. 这题目不难吧
2. 样例中的第 9 行 "3 4 4 6" 是什么鬼?超范围了吧
2、怎么超范围了?左上角3、4右下角4、6;从1开始3行和4行,4、5、6列 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 人造人 发表于 2021-10-17 13:26
3 4 4 6
x1 = 3
5行7列,6是列 jhq999 发表于 2021-10-17 13:27
5行7列
最后的这个 6 是行还是列,是 x 值还是 y 值?
最前面的 5 7,哪一个是行,哪一个是列,哪一个是 x 值,哪一个是 y 值?
5 是行,7是列,对应二维数组 jhq999 发表于 2021-10-17 13:27
5行7列,6是列
5 是 y,
7 是 x
最后面的 6 是 y
人造人 发表于 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}
}; jhq999 发表于 2021-10-17 13:32
对呀,最后面的 6 是 y
y 最大就是 5
人造人 发表于 2021-10-17 13:34
对呀,最后面的 6 是 y
y 最大就是 5
{3,4,5,6,7,1,2}, 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
$ 人造人 发表于 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 #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 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 方向:从上向下
像下面这样
刚才我也蒙,按理来说 x 应该是列,y 应该是行才是,题目倒转了(可能题目 x 和 y 是以矩阵为位置吧,不是数学的坐标为位置) 人造人 发表于 2021-10-17 13:53
嗯,我看了一下,反过来确实会输出
横为行,竖为列
所以5行7列 jhq999 发表于 2021-10-17 14:29
横为行,竖为列
所以5行7列
对于这个题目来说
x 方向是 竖向
y 方向是 横向
我没见过这样的,除了在这里
如果没有官方的定义,我就不承认这一点
x 方向是 竖向
y 方向是 横向
我就认为我的代码是对的,是题目错了,^_^
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; #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]