(比赛回顾)广工大2020级年ACM第一次月赛–Problem G: 秧歌Star不要上补习班

   日期:2020-10-20     浏览:121    评论:0    
核心提示:(比赛回顾)广工大2020级年ACM第一次月赛–Problem G: 秧歌Star不要上补习班题目(比赛回顾)广工大2020级年ACM第一次月赛--Problem G: 秧歌Star不要上补习班题目DescriptionInputOutputSample InputSample Output问题分析AC代码题目DescriptionDio的儿子茸茸整天想要当秧歌Star,Dio眼看着他的成绩下滑很焦灼。决定让茸茸上Jo太郎老师开的补习班。Jo太郎听闻茸茸的梦想之后很感动,对茸茸说如果你能够在接下来的

题目

  • 题目
    • Description
    • Input
    • Output
    • Sample Input
    • Sample Output
  • 问题分析
  • AC代码

题目

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;
        }
        long long num=0;
        //根据坐标框定范围
        for (int z = x1; z <= x2; ++z) { 
            for (int p = y1; p <= y2; ++p) { 
                num+=v[z][p];
            }
        }
        //遍历求和
        printf("%lld\n",num);
    }
    return 0;
}
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服