zzuli:2022级天梯赛第一阶段题题解

1-1 无所谓,我会出手

题目描述

请直接输出 :“It doesn’t matter,I’ll do it.”(输出不含引号)。

输入格式

没有输入。

输出格式

It doesn’t matter,I’ll do it.

题目分析

hello world!级别题目。

代码实现

#include<stdio.h>
int main()
{
    printf("It doesn't matter,I'll do it.");
    return 0;
}

运行结果

在这里插入图片描述

1-2 数组总和

题目描述

给出一个正整数 n 和一段长度为n的数组a 1,a 2…an,请输出1×a1+​2×a2+3×a 3+4×a 4+…+n×an的结果。

输入格式

第一行为 整数 n(1<=n<=1e3)第二行为n 个整数 ai(1<=ai<=1e9 )

输出格式

输出一行一个正整数,代表题目要求的值。

题目分析

本题直接按照表达式来计算就行,但要注意整数的范围,给其一个合适的数据类型。

代码实现

#include<stdio.h>
int main()
{
    int n;//输入数据的个数
    scanf("%d",&n);
    unsigned long long add=0;//输出的总和
    for(int i=1;i<=n;i++)//i可以为每次乘法的常数,故从1开始
    {
        unsigned long long p;
        scanf("%llu",&p);
        add+=i*p;
    }
    printf("%llu\n",add);
    return 0;
}

运行结果

在这里插入图片描述

1-3 捡到一个矩形

题目描述

这天,我捡到了一个二维坐标轴,坐标轴上有一个矩形,现在给出一个点的坐标,问这个坐标是否在矩形中。

输入格式

输入第一行一个整数t,代表测试组数 (1<=t<=10)接下来2×t行,每组测试用例第一行为四个整数,分别为正方形的左下角的坐标x1,y1和矩形的右上角 x2,y2
第二行为询问的点的坐标 x,y(−1e9<=x,y,x1,x2,y1,y2<=1e9)

输出格式

如果在矩形中或者在矩形的边界上,输出 YES;否则输出 NO。

题目分析

本题给出矩形两对角坐标,我们通过一个坐标轴可以得出如果一个点在这个矩形里面,则这个点的横坐标在两对角坐标横坐标之间,这个点的纵坐标在两对角坐标纵坐标之间,由此可以判断出给出点的坐标是否在矩形内。
注意数据的范围,给其一个合适的数据类型。

代码实现

#include<stdio.h>
int main()
{
    int t;
    scanf("%d",&t);//测试数据数量
    while(t--)
    {
        long long x1,y1,x2,y2;//两对角坐标
        scanf("%lld %lld %lld %lld",&x1,&y1,&x2,&y2);
        long long x,y;//给出点的坐标
        scanf("%lld %lld",&x,&y);
        long long max1,min1,max2,min2;
        //下面两个if语句用来找出两个横纵坐标较大和较小的那个
        if(x1>x2)max1=x1,min1=x2;
        else max1=x2,min1=x1;
        if(y1>y2)max2=y1,min2=y2;
        else max2=y2,min2=y1;
        //下面进行判断
        if(min1<=x&&x<=max1&&min2<=y&&y<=max2)printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

运行结果

在这里插入图片描述

1-4 字符转换

题目描述

现给你一种对字符的操作,使其变成该字符在字母表后的第x个位置,x为该字符在字母表中的位置。例如,对字符a进行操作,会将其变成a后的第一个字母,即b;对字符b进行操作,会将其变成b后的第二个字母,即d…以此类推。
需要注意的是,该字母表是一个循环字母表,即字符z后的第一个字符是a,a后又是b,循环往复。
现在给你一个字符串s,s 均由小写字母组成,1<=∣s∣<=1e5,请输出对字符串s的每一位字符进行操作后的结果。

输入格式

一行输入一个字符串s,含义如题面所示

输出格式

输出一行一个字符串,代表对s每一位字符进行操作后的结果。

题目分析

本题要算出字母在字母表中的位置,通过a的ASCII码值我们知道a的ASCII码值为97,所以将字母字符减96即可得到字母在字母表中的位置。
再通过字符字母加这个对应的数字来实现移位操作,但要注意char的范围最大为127,可以换成int类型来求得,详情见以下代码。

代码实现

#include<stdio.h>
int main()
{
    char a[100001];
    gets(a);//输入字符串
    for(int i=0;a[i]!='\0';i++)
    {
        int x=a[i]-96;//计算字母在字母表中的位置
        int b=a[i]+x;//转换int类型
        if(b>'z') b-=26;
        printf("%c",b);//%c直接打印字符
    }
    return 0;
}

运行结果

在这里插入图片描述

1-5 捡到了一个成绩

题目描述

天梯赛过后,所有同学的成绩被打印在一张纸上。现在老师想要统计某班得分的均值,以及得分高于这个均值的同学们的分数之和,请你帮助老师计算出这两个值。

输入格式

第一行输入一个正整数n,代表该班级的人数。(1<=n<=30)
第二行输入n个整数,代表第i名同学的得分x。(0<=x<=290)

输出格式

输出两行,第一行输出一个实数,代表得分的均值。(保留到小数点后三位)
第二行输出一个整数,代表得分高于该班级分数均值的同学们的分数之和。

题目分析

本题先根据输入分数计算平均分,再循环一遍与平均分比较,高于平均分即可进行累加。

代码实现

#include<stdio.h>
int main()
{
    int n;//班级人数
    int point[31];//每人分数
    scanf("%d",&n);
    long long add=0;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&point[i]);
        add+=point[i];//分数累加
    }
    double ave=1.0*add/n;//平均值计算
    add=0;//存得分高于该班级分数均值的同学们的分数之和
    for(int i=0;i<n;i++)
    {
        if(point[i]>ave)add+=point[i];//与平均分比较并进行累加
    }
    printf("%.3f\n%d\n",ave,add);//输出结果
    return 0;
}

运行结果

在这里插入图片描述

1-6 炎爆

题目描述

cys学姐非常喜欢Arknights这款游戏,而其中伊芙利特是她最引以为傲的干员之一。
给你一个n×n的矩形a,矩形中的每一个位置都有一个敌人,其中a[x][y]代表矩形第x行,第y列上的敌人。
假设伊芙利特部署在(x,y)的位置上,并且朝向右,那么伊芙利特会对(x,y),(x,y+1),(x,y+2)…(x,n)的所有敌人造成1点伤害。
现在给你q次部署,每次部署都给出一个部署位置(x,y),代表伊芙利特部署在矩形的第x行,第y列,再给出一个字符op,代表伊芙利特的朝向(U代表向上,R代表向右,D代表向下,L代表向左)。
你能精确算出每个敌人受到的伤害吗?

输入格式

第一行一个正整数n,代表矩形的大小(1<=n<=100),初始情况下所有敌人受到的伤害为0。
第二行给出一个正整数q,代表伊芙利特的部署次数(1<=q<=50)。
接下来q行,每行给定一个数对(x,y),1<=x,y<=n,代表伊芙利特的部署位置,和一个字符op,op∈{U,R,D,L},代表伊芙利特的朝向。

输出格式

输出n行,每行n个整数,分别对应矩阵a中每个敌人受到的伤害。
注意:pta输出格式不允许有行末空格,如果格式错误请检查是否行末输出空格。

题目分析

本题可以给矩形方阵建立一个直角坐标系,如下图所示
在这里插入图片描述

如图所示,取向下为x轴,向右为y轴。

代码实现

#include<stdio.h>
int main()
{
    int n;//棋盘大小
    scanf("%d",&n);
    int a[101][101]={0};//每个小怪受到初始攻击为0
    int q;//攻击次数
    scanf("%d",&q);
    while(q--)
    {
        char op;//攻击方向
        int x,y;//伊芙利特的部署位置
        scanf("%d %d %c",&x,&y,&op);
        if(op=='L')//向左攻击,x值不变
            for(int i=y;i>0;i--)a[x][i]++;
        else if(op=='D')//向下攻击y值不变
            for(int i=x;i<=n;i++)a[i][y]++;
        else if(op=='R')//向右攻击,x值不变
            for(int i=y;i<=n;i++)a[x][i]++;
        else if(op=='U')//向上攻击,y值不变
            for(int i=x;i>0;i--)a[i][y]++;
    }
    for(int i=1;i<=n;i++)//输出每个敌人受到的伤害。
    {
        for(int j=1;j<n;j++)
        {
            printf("%d ",a[i][j]);
        }
        printf("%d\n",a[i][n]);//结尾不能有空格,可以这种方式解决
    }
    return 0;
}

运行结果

在这里插入图片描述

1-7 攻略迷宫

题目描述

小A准备挑战一个副本,他的角色拥有 x 点生命值,boss 每第 y 秒攻击一次,每次对角色造成1点伤害,当角色生命值为零时游戏结束,不会再受到攻击。现在给你一个时间段,假如小A从这个时间段开始时着手攻略副本,小A想知道他的角色在这段时间内会承受多少次攻击,以及最后一次被攻击的时间。

输入格式

第一行两个整数 x 和 y(1<=x,y<=100) ,由空格隔开。
下面两行两个时间,格式为XX:XX:XX ,代表给定的时间段的开始和结束时间。
数据保证时间合法,且开始时间和结束时间在同一天

输出格式

输出共两行:
第一行为小A的角色承受boss攻击的次数
第二行一个时间,代表小A的角色最后一次遭受攻击的时间,格式为XX:XX:XX

题目分析

本题可先计算两个时间段间隔多少秒,在除以攻击间隔时间,计算出该时间释放攻击最大次数z。再与血量比较,当血量低于z,结束时间提前为开始时间加承受攻击次数乘攻击时间间隔且承受攻击次数为血量;当血量高于z,结束时间为开始时间加承受攻击次数乘攻击时间间隔且承受攻击次数为z。

代码实现

#include<stdio.h>
int main()
{
    int x,y,h1,m2,s1,h2,m1,s2,z;
    scanf("%d %d",&x,&y);
    scanf("%d:%d:%d",&h1,&m1,&s1);//开始时间
    scanf("%d:%d:%d",&h2,&m2,&s2);//结束时间
    z=(h2*3600+m2*60+s2-(h1*3600+m1*60+s1))/y;//时间段内最大攻击次数
    if(x>=z)
    {
 //当血量高于z,结束时间为开始时间加承受攻击次数乘攻击时间间隔且承受攻击次数为z
 		int a=h1*3600+m1*60+s1+z*y;
        printf("%d\n",z);
        printf("%02d:%02d:%02d\n",a/3600,a%3600/60,a%3600%60);
    }
    else if(x<z)
    {
 //当血量低于z,结束时间提前为开始时间加承受攻击次数乘攻击时间间隔且承受攻击次数为血量
    	int a=h1*3600+m1*60+s1+x*y;
        printf("%d\n",x);
        printf("%02d:%02d:%02d\n",a/3600,a%3600/60,a%3600%60);
    }
    return 0;
}

运行结果

在这里插入图片描述

1-8 Vampire Survivors

题目描述

你说的对,但是 《吸血鬼幸存者》是一款roguelike的生存动作游戏。玩家控制一个角色,面对满屏如潮水般的敌人,移动、射击、施法,极限求生。
在游戏中一个主武器和一个它对应的副武器可以合成出一个超级武器,武器名称和武器合成公式会在题面给出。
现在给出一个整数n,和你获得的n个主武器或副武器,每种超级武器都有一个对应的攻击力atki,不能合成的副武器和主武器不计算伤害。你将所有能合成的武器合成之后的总攻击力是多少呢?
请注意,主武器,副武器与超级武器一一对应,只有对应的主武器和副武器才能合成相应的超级武器
在这里插入图片描述

输入格式

第一行给出 一个整数 n,(1<=n<=12)
随后给出 n行,每一行一个字符串s,代表一个武器的名称,题目保证不会给出重复的武器。
最后一行给出6个正整数atki,用空格隔开,依次对应图表中6个合成公式中超级武器的伤害。(1<=atki<=100)

输出格式

输出一行一个正整数,代表合成完所有能合成的武器后你能获得的总攻击力。

题目分析

本题通过输入的武器与表格中的武器进行比较,如果出现每种搭配里的一个武器就看看是否还有另一个武器和他搭配。如果有就对攻击力累加。

代码实现

#include<stdio.h>
#include<string.h>
//初始化每种武器搭配
struct Weapon{
    char weapon1[20];//主武器
    char weapon2[20];//副武器
    int harm;//攻击值
}a[6]={{"Magic_Wand","Empty_Tome",0},{"Axe","Candelabrador",0},{"Knife","Bracer",0},{"Cross","Clover",0},{"King_Bible","Spellbinder",0},{"Fire_Wand","Spinach",0}};
int main()
{
    int add=0;//存储总攻击力
    int n;//武器数量
    char a2[13][20];
    scanf("%d",&n);
    getchar();
    for(int i=0;i<n;i++){gets(a2[i]);}//输入武器名称
    for(int i=0;i<6;i++){scanf("%d",&a[i].harm);}//输入每种武器组合的攻击力
    for(int i=0;i<n;i++)//对每个有的武器进行检索
    {
        for(int j=0;j<6;j++)//与每种组合进行对比
        {
            if(strcmp(a2[i],a[j].weapon1)==0)
            //如果武器为某种组合的主武器
            {
                for(int p=0;p<n;p++)
                //寻找所有武器中是否有该武器的副武器
                {
                    if(strcmp(a2[p],a[j].weapon2)==0)
                    {
                        add+=a[j].harm;//如果组合成功,总武力值增加
                        a[j].weapon2[1]='\0',a[j].weapon1[1]='\0';
                        //并清除两种武器,我们用‘\0’来实现
                        break;
                    }
                }
            }
            else if(strcmp(a2[i],a[j].weapon2)==0)
            //如果武器为某种组合的副武器
            {
                for(int p=0;p<n;p++)
                //寻找所有武器中是否有该武器的主武器
                {
                    if(strcmp(a2[p],a[j].weapon1)==0)
                    {
                        add+=a[j].harm;//如果组合成功,总武力值增加
                        a[j].weapon2[1]='\0',a[j].weapon1[1]='\0';
                        //并清除两种武器,我们用‘\0’来实现
                        break;
                    }
                }
            }
        }
    }
    printf("%d\n",add);//输出获得的总攻击力
    return 0;
}

运行结果

在这里插入图片描述

  • 26
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值