计算机学院2022级新生邀请赛(一)

目录

A: Hello , HAUE

B: 我必须立刻签到,因为它有手就行

C: OrzOrzOrz 

D: 红心诡计   

E: 不要停下来啊!!! 

F: 反卷行动 

G: 机器人OR寄器人 

H: 帕秋莉GO!!! 

另一篇出题人官方题解 

A: Hello , HAUE

题目描述

欢迎大家参加河南工程学院2022级第一次新生周赛,LYS代表计算机ACM协会在此祝愿大家的大学生涯一帆风顺,自信满满;友情爱情,两全其美;三阳开泰,学业大展;魅力四射,朋友万千;五福临门,幸福美满;六六大顺,学识博渊;七步之才,知识无边;八仙过海,才华呈现;九霄云外,烦恼抛开;十全十美,大学前途熠熠生辉!!!

输入

第一行,输入一个整数 N。

输出

输出占一行,不含引号。

若 N = 1,输出 "One Sail Wind Go"。

若 N = 6,输出 "Six Six Big Go"。

若 N = 10,输出 "Ten OK Ten OK"。

若 N = 2022,输出 "Hello , HAUE"。

样例输入 

2022

样例输出 

Hello , HAUE

源代码 

很简单的if语句来匹配实现,输出对应字符串即可 

#include <iostream>
using namespace std;
int main()
{
    int n;
    cin >> n;
    if(n == 1)cout << "One Sail Wind Go";
    else if(n == 6)cout << "Six Six Big Go";
    else if(n == 10)cout << "Ten OK Ten OK";
    else if(n == 2022)cout << "Hello , HAUE";
    return 0;
}

B: 我必须立刻签到,因为它有手就行

题目描述

在算法竞赛的题目当中,有很多难度逆天的题,然鹅,也有个别的题肥肠煎蛋,像这种HFCJ一看就是"有手就行"的题目就被称之为签到题。
例如这道题目:

输入

第一行,输入一个整数 X。

输出

一行,输出按照上述公式计算所得 X 的结果。

样例输入

2

样例输出

4

源代码 

简单的递归函数的运用,注意数据范围int将会溢出,要开long long 

#include <iostream>
using namespace std;
long long fun(long long x)
{
    if(x >= 0 && x <= 10)return x * x;
    else if(x > 10 && x <= 50)return x * fun(x - 5);
    else if(x > 50 && x <= 100)return (x + fun(x - 10));
}
int main()
{
    long long x;
    cin >> x;
    long long ans = fun(x);
    cout << ans;
    return 0;
}

C: OrzOrzOrz 

题目描述

河工院21级计算机学院和软件学院存在着许许多多的大佬,这些大佬都是LYS所膜拜的对象,他们分别是:陈佬(C) ,郭佬(G),皇甫爷(H),金佬(J),李佬(L),魏佬(W),邢佬(X),毅佬(Y),朱佬(Z) 等等诸多大佬(以上排名不分先后,未列出亦视为大佬),由于这些大佬经常水群,所以大家对这些大佬耳熟能详。

每次见到这些大佬在群里出现,LYS就会膜拜一番,发出“OrzOrzOrz”的消息,对于未列出的大佬出现,LYS见到了只敢在心中膜拜,不敢发消息

一天结束,LYS想要统计今天见到的大佬的次数,可统计实在是个大工程,令LYS肥肠困扰,你能帮助他进行统计吗?

输入

第一行输入两个整数 N 和 M,代表大佬出现 N 次和 M 次询问。

第二行输入 N 个大写字母 (A~ Z),代表出现的大佬的编号。

接下来 M 行,每行输入一个大写字母 (A~Z),代表询问的大佬编号。

0≤N≤1e4
1≤M≤26

输出

第一行输出询问编号的大佬出现的次数,若该编号的大佬是上述列出的大佬且出现过,则输出一个空格后输出"OrzOrzOrz"(不加引号)。

样例输入

12 6
D N F H L H W Z A W H J
C
Z
W
A
J
H

样例输出

0
1 OrzOrzOrz
2 OrzOrzOrz
1
1 OrzOrzOrz
3 OrzOrzOrz

源代码 

利用类型转换,将字符转换为数组下标,同时也是离散化的思想,将字母A-Z映射至1-26,由于其中含有陈佬(C) ,郭佬(G),皇甫爷(H),金佬(J),李佬(L),魏佬(W),邢佬(X),毅佬(Y),朱佬(Z),因此读取的字符若是属于他们其中一位,即为LYS熟悉的佬,输出出现次数之后而后开始OrzOrzOrz,否则证明LYS和出现的佬不熟悉他不敢OrzOrzOrz,那么仅仅输出

#include <iostream>
using namespace std;
int a[100];
int main()
{
    int n,m;
    cin >> n >> m;
    while(n -- )
    {
        char c;
        cin >> c;
        int idx = c - 'A' + 1;
        a[idx] ++ ;
    }
    while(m -- )
    {
        char c;
        cin >> c;
        int idx = c - 'A' + 1;
        if(c == 'C' || c == 'G' || c == 'H' || c == 'J' || c == 'L' || c == 'W' || c == 'X' || c == 'Y' || c == 'Z')
        {
            if(a[idx] == 0)cout << 0 << endl;
            else
            {
                cout << a[idx] << ' ' << "OrzOrzOrz" << endl;
            }
        }
        else cout << a[idx] << endl;
    }
    return 0;
}

D: 红心诡计   

 Vainglory(虚荣)是由Super Evil Megacorp开发的魔幻风格MOBA类手游,曾依靠超高质量的游戏画质和独特的“点触”操控,在全球收割了千万玩家的喜爱,借助独家的游戏渲染引擎,这款风靡全球的游戏亦曾两度被Apple公司选作Iphone的性能演示宣传片,由该团队首席环境艺术设计师EvilOnTheInside绘制的地图令人着迷。除此之外,独具特色的操控和精心设计的英雄角色,也令Vainglory在MOBA竞技史上给所有人留下了深刻的印象。

可惜的是,由于Vainglory独特的操控模式上手难度极大,以及种种运营不善等原因,导致这款曾经的现象级的游戏在2020年停止了运营,但停服之后,仍有大量热爱Vainglory的玩家活跃在社区服,LYS也不例外。
LYS肥肠喜欢使用剑客黑羽这名角色,因为他不但有爆发性的刺客输出,也有一定的拉扯和扛伤能力,同时还兼具免控与位移为一体的高机动性技能,使得他在单体和团战都能发挥强大的作用。

其中,该英雄的一技能"红心诡计"描述如图:
 


例如:对于某一次正在发生的团战,LYS的黑羽已经将”红心诡计“升至了 5 级,满级的黑羽基础物理普通攻击的伤害是 160,且身上的装备为其提供了 50 点物理强度和 300 点法术强度。

此时LYS遇到了一名敌人,该敌人当前生命值为 500,生命值上限为 2800,他在敌人到达技能释放范围内时,发动了”红心诡计“,迅速位移至敌人位置对其施加了满层的“震颤红心”并造成伤害,击杀了敌人并刷新了“红心诡计”的冷却时间,其伤害计算如下:
 


已知

当前LYS已经将”红心诡计“升至了 5 级,且黑羽的等级已达到最大,其基础物理普通攻击的伤害是 160。

: 敌人原地挂机不动,LYS是否可以操作黑羽,在 (X,Y) 处选择任意一个在技能范围 D 之内的敌人开始,使用“红心诡计”位移到其身边击杀敌人并刷新技能,然后选择下一个敌人,如此重复,直到击杀所有的 5 名敌人。若"红心诡计"的范围内不存在敌人或使用一次”红心诡计“无法击杀敌人,LYS将停止后续的操作

输入

第一行 5 个数,分别为黑羽装备的物理强度 AD,法术强度 AP,黑羽目前的位置横坐标 X 和纵坐标 Y,以及以 (X,Y) 为中心的”红心诡计“释放范围半径 D。

接下来 5 行,每行四个数,分别为敌人当前所剩的生命值 L,生命上限 R,以及其位置的横坐标 x 和纵坐标 y.
0≤AD,AP,D≤1000
-1000≤X,Y,x,y≤1000
1≤L≤R≤5000

输出

第一行,若可以击杀全部敌人,输出”YES“,否则输出”NO“。

若为"NO",第二行额外输出一个整数,表示最大击杀数。

样例输入 

50 200 0 0 3
200 1500 0 3
800 4000 2 2
100 1200 1 1
500 3900 3 0
600 4400 4 3

样例输出 

YES

提示

对于样例 ,可行的情况为从 (0,0) 开始,先击杀 (0,3) 刷新了技能,然后击杀 (1,1) 再次刷新技能,接着击杀 (3,0),(2,2),(4,3)或者从 (0,0)开始,先击杀 (3,0) 刷新了技能,然后击杀 (1,1) 再次刷新技能,接着击杀 (0,3),(2,2),(4,3)

源代码 

简单的DFS深度优先搜索,属递归函数,也属基础算法。首先,在我们进行AP、AD、X、Y、D的输入之后,进行5组敌人的数组输入,在每个敌人的数据进行输入时,结合已经给定的AP、AD来计算是否能够击杀其,若是不能击杀则在vis用于标记的数组之中置其为0(1为可杀0为不可杀),而后开始进行深度优先搜索,在搜索的时候选择距离合适的杀(运用cmath库的sqrt函数来计算两点之间的距离),不管三七二十一就是杀,杀完个再杀一个,直到不能杀了(人被杀完了或者不能再杀了),回归条件为杀人人数,若是满足5人则置flag为1用于输出YES,否则求取所杀人的最大值,而后返回一步换另一人杀,若是还不能杀则返回上一步,继续换人杀,所有路走完毕时,输出NO和所杀人的最大值即可

#include <iostream>
#include <cmath>
using namespace std;
double AD,AP,X,Y,D;
double x[10],y[10],L[10],R[10],s[10];
int vis[10],flag = 0,ans = 0;
void dfs(int x0,int y0,int nums)
{
    ans = max(ans,nums);
    if(nums == 5)
    {
        flag = 1;
        return;
    }
    for(int i = 1;i <= 5;i ++ )
    {
        double d = sqrt((x0 - x[i]) * (x0 - x[i]) + (y0 - y[i]) * (y0 - y[i]));
        if(d <= D && vis[i] == 0)
        {
            vis[i] = 1;
            dfs(x[i],y[i],nums + 1);
            vis[i] = 0;
        }
    }
}
int main()
{
    cin >> AD >> AP >> X >> Y >> D;
    for(int i = 1;i <= 5;i ++ )
    {
        cin >> L[i] >> R[i] >> x[i] >> y[i];
        s[i] = 240 + AP * 0.5 + 160 + AD * 1.0 + (R[i] - L[i]) * 0.25;
        if(s[i] < L[i])vis[i] = 1;
    }
    dfs(X,Y,0);
    if(flag == 1)cout << "YES" << endl;
    else cout << "NO" << endl << ans << endl;
    return 0;
}

E: 不要停下来啊!!! 

题目描述

新的学期开始了,我们的奥尔加团长又一次嘱托我们,无论以后学习遇到什么困难,都请记住:“不要停下来啊!!!”
 

输入

同样例输入

第一行输入三个整数N,M,K,代表一个N行M列的二维数组和K行坐标信息

接下来共K行,每行输入两个整数x,y,对于二维数组(x,y)位置的点标记为"#",未被标记的点记为"."

输出

同样例输出(注意每个字符间隔一个空格)

样例输入 

15 9 44
0 2
1 1
2 1
3 1
3 3
3 4
4 1
4 3
4 4
5 1
5 2
5 3
5 4
5 5
5 6
6 2
6 3
6 4
6 5
6 6
7 2
7 3
7 4
7 5
7 6
8 2
8 3
8 4
8 5
8 6
9 3
9 4
9 6
10 3
10 5
10 7
11 3
11 6
12 3
12 6
13 3
13 6
14 3
14 6

样例输出

. . # . . . . . .
. # . . . . . . .
. # . . . . . . .
. # . # # . . . .
. # . # # . . . .
. # # # # # # . .
. . # # # # # . .
. . # # # # # . .
. . # # # # # . .
. . . # # . # . .
. . . # . # . # .
. . . # . . # . .
. . . # . . # . .
. . . # . . # . .
. . . # . . # . .

源代码 

简单的二维字符型数组的处理 

#include <iostream>
using namespace std;
const int N = 1000 + 10;
char a[N][N];
int main()
{
    int n,m,k;
    cin >> n >> m >> k;
    while(k -- )
    {
        int x,y;
        cin >> x >> y;
        a[x][y] = '#';
    }
    for(int i = 0;i < n;i ++ )
    {
        for(int j = 0;j < m;j ++ )
        {
            if(a[i][j] != '#')a[i][j] = '.';
            cout << a[i][j] << ' ';
        }
        cout << endl;
    }
    return 0;
}

F: 反卷行动 

题目描述

众所周知,河工院的计算机学院和软件学院存在着许多大佬,这些大佬们每天最喜欢做的事情就是口口声声的称:"今天又是摆烂的一天,啥也没干",其实背地里却是名副其实的"卷王",私底下学了不少东西

LYS心中大惊Σ(っ °Д °;)っ!他说:“这样好吗?这不好!”

LYS深知卷王的可怕,靠近卷王的人迟早也会被卷王传染,进而也会变成卷王,如此下去,所有人都将被卷,这太可怕了!

可惜的是,变成卷王的人再也变不会原来的样子了,所以LYS只能尽可能的想办法守护还没有变成卷王的人。
 

输入

第一行输入两个整数N,M,分别代表寝室最大编号和卷王宿舍的数量


5≤N≤1e9
1≤M≤min(N,2e5)
1≤mi≤N

输出

输出一个整数,输出最终没有被变成卷王的宿舍数量

样例输入 

6 2
3 5

样例输出

2

提示

输入的卷王宿舍编号的顺序是随机的

源代码 

局部最优化、贪心原则,首先我们将问题模型简化,将所有的宿舍看作一个环,其中的卷王宿舍就好比生物课本之中嵌入环之中的蛋白质,计算每两个环之间的非卷王宿舍个数,对于首尾相良的非卷王宿舍我们采取特判来进行计算,注意题目提示,卷王宿舍并非按照一定顺序给出,而是随机的,因此,我们首先要对卷王宿舍进行sort升序排序,而后对其遍历,在遍历之中利用特判计算首位相连之间的非卷王宿舍的个数,并计算两个卷王宿舍之间的非卷王宿舍的个数,存入动态数组当中,对于动态数组中的数据采用cmp重定义使其降序排序,得到一个降序序列,而后我们将两天两天的计算,举个例子,初始时所能感染的个数flag为0,若是两个卷王宿舍之间存在非卷王宿舍,非卷王宿舍的个数之和A[i]大于等于2,那么两天之后我们能够得到的受保护的非卷王宿舍个数则是A[i] - 1,ans加上A[i] - 1即可,在此两天之内,此二者卷王宿舍所能感染的宿舍为4个,因此感染数flag自增4,i自增1,从而对于下一个非卷王宿舍数的和进行判断,和A[若是下一个非卷王宿舍之i]减去flag大于等于2则ans加上A[i] - 1即可,若是A[i]减去flag小于等于0,则跳出循环,若是A[i]减去flag等于1,则ans加1再break

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> A,B;
int cmp(int a,int b)
{
    return a > b;
}
int main()
{
    int n,m;
    cin >> n >> m;
    int ans = 0;
    int extra = 0;
    for(int i = 1;i <= m;i ++ )
    {
        int num;
        cin >> num;
        B.push_back(num);
    }
    sort(B.begin(),B.end());
    for(int i = 0;i < B.size();i ++ )
    {
        if(i == 0)
        {
            if(B[i] == 1)extra += 0;
            extra += B[i] - 1;
        }
        else if(i == int(B.size()) - 1)
        {
            if(B[i] == n)extra += 0;
            else extra += n - B[i];
        }
        if(i - 1 >= 0)A.push_back(B[i] - B[i - 1] - 1);
    }
    A.push_back(extra);
    sort(A.begin(),A.end(),cmp);
    int flag = 0;
    for(int i = 0;i < int(A.size());i ++ )
    {
        A[i] -= flag;
        if(A[i] == 1)
        {
            ans += 1;
            break;
        }
        if(A[i] <= 0)break;
        ans += A[i] - 1;
        flag += 4;
    }
    cout << ans << endl;
    return 0; 
}

G: 机器人OR寄器人 

题目描述

随着新学期的开始,HFCJ学长准备开发一个可以接收指令从而行动的机器人,现在硬件部分的设计已经解决,只剩下编辑指令和处理的部分。可是这种小事对他来说太简单了,用他的原话说就是:"有手就行",于是他就懒得继续做下去了。

HFCJ把这个做了一半的机器人丢给了LYS,如果他能完成剩余的工作,并且成品能够通过测试,那么这个机器人就归LYS辣。

以下是待完成的任务要求:
 



LYS肥肠想要这个机器人,可是他啥也不会,现在他来找你帮忙了,你能帮帮他吗?

输入

输出

一行,输出两个整数,表示执行完所有指令后机器人的坐标
1≤N,M≤1000
-1000≤X,Y,x,y≤1000
 

样例输入

3 4 0 0
1 1
-1 -1
2 2
1 3 2 2

样例输出

1 1

源代码 

对于二维坐标移动的指令进行存储,创建两个一位数组,一个记录x的变化,一个记录y的变化,若在接下来m次调用指令的过程之中,将目前的X + dx[m],Y + dy[m]即可完成坐标的变换,输出最后的坐标即可 

#include <iostream>
using namespace std;
const int N = 100000 + 10;
int dx[N],dy[N];
int main()
{
    int n,m,x,y;
    cin >> n >> m >> x >> y;
    for(int i = 1;i <= n;i ++ )cin >> dx[i] >> dy[i];
    while(m -- )
    {
        int num;
        cin >> num;
        x = x + dx[num];
        y = y + dy[num];
    }
    cout << x << ' ' << y;
    return 0; 
}

H: 帕秋莉GO!!! 

题目描述

众嗦♂粥汁,帕秋莉·诺蕾姬是《东方Project》系列弹幕游戏及其衍生作品的登场角色之一。

她是大小姐蕾米莉亚的好朋友,是个大概有100岁的魔女。她居住在幻想乡中藏书最多的大图书馆——红魔馆地下图书馆中。喜欢读书,并且会使用七曜魔法。

贤者(Philosopher)的另一个意思是哲学家,因此也可称她为七曜的哲♂学家。平常总待在大图书馆里的她,患有哮喘、贫血,体质虚弱,因此在肉搏♂战中非常劣势。

在比利王客串的兄贵本篇TalesFromTheFoxhole里,作为军官的比利对于下属的小兵在休息时间感到不满而发出的“Attention on”因为音质问题常被空耳成“帕秋莉♂GO”。



由于某种不可知的异变,姆Q穿越到了知名演员野兽♂仙贝的家中,这名不谙世事的马猴烧酒头一次从红魔馆的地下走出,没想到居然会收获颇丰,她在野兽♂仙贝的激情指导下学习到了她从未见识过的膜法,只不过由于哮喘的原因,导致她无法将这强大的咒语一次性咏唱完毕。

我们的姆Q非常困扰,她决定将这条强大的咒语告诉你,想借助科学的力量完成咏唱,你能帮帮她吗?

咒语:持续进行咏唱“114514”直到达到“1919“次

输入

输出

每行输出"114514"(不包含引号),共输出1919行

源代码 

签到题,太简单了 

#include <iostream>
using namespace std;
int main()
{
    for(int i = 1;i <= 1919;i ++ )cout << "114514" << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/couchpotatoshy/article/details/127027105