3.27 网易春招(第一批)

第一题:小红杀怪

题目描述:

小红在一个游戏里杀怪。这是个回合制游戏,小红和两只怪物相遇了。
第一只怪物有 a a a 血量,第二只怪物有 b b b 血量。
小红有两个技能:
第一个技能叫火球术,效果是对单体怪物造成 x x x 伤害。
第二个技能叫烈焰风暴,效果是对每只怪物造成 y y y 伤害。
小红想知道,自己最少使用多少次技能,可以击杀这两只怪物。
(当怪物血量小于等于0时,视为被击杀)

输入描述:

四个正整数 a , b , x , y a,b,x,y a,b,x,y,用空格隔开。
1 < a , b , x , y < 20 1\lt a,b,x,y\lt20 1<a,b,x,y<20

输出描述:

小红使用技能的最少次数。
示例1

输入
5 2 3 1
输出
3

思路:

对情况逐一判断。

AC代码
#include<iostream>
#include<cstring>
using namespace std;
const int N=1010;
int res = 0;
int a,b,x,y;
int main()
{
    cin>>a>>b>>x>>y;
    if(y >= x) res = max((a + y - 1) / y, (b + y - 1) / y);
    else
    {
        while(a > 0 || b > 0)
        {
            if(2 * y >= x && a > 0 && b > 0)
            {
                res ++;
                a -= y;
                b -= y;
            }
            else if(a > y && b > y)
            {
                res += 2;
                a -= x;
                b -= x;
            }
            else if((a > 0 && b > 0) && (a <= y || b <= y))
            {
                res ++;
                a -= y;
                b -= y;
            }
            else if(a > 0 && b <= 0)
            {
                res ++;
                a -= x;
            }
            else if(b > 0 && a <= 0)
            {
                res ++;
                b -= x;
            }
        }
    }
    cout<<res<<endl;
    return 0;
}

第二题:小红标字母

题目描述:

小红拿到了一个字符串,她可以做任意次以下操作:
标记这个字符串两个位置相邻的字母,并且这两个字母必须满足以下条件才可标记:两个字母相同或者两则字母在字母表中相邻。小红可以获得两个字母的分数。
举个例子,'a’和’b’在字母表相邻,'t’和’s’在字母表相邻。
我们规定,已经被标记的字母无法被重复标记。
每个字符获得的分数是不同的,'a’可以获得1分,'b’可以获得2分,以此类推,'z’可以获得26分。
小红想知道,自己最多可以获得多少分?

输入描述:

输入一行只包含小写字母的非空字符串 S S S,代表小红拿到的字符串。
1 < l e n ( s ) < 200000 1\lt len(s)\lt200000 1<len(s)<200000

输出描述:

小红可以获得的最大分数。
示例1

输入
abdbb
输出
7
说明
第一次标记前两个字母’a’和’b’,获得3分。第二次标记后两个字母’b’和’b’,获得4分。

示例2

输入
abb
输出
4

思路:

找出所有连续可标记的字符串,若长度为偶数则直接加入答案,为奇数则可以删掉下标模2为0的字母中最小的那一个。

AC代码
#include <bits/stdc++.h>
using namespace std;
const int N=2010;

string s;
int res,j;

int main()
{
    cin>>s;
    int n = s.size();
    for(int i = 1; i < n; i ++)
    {
        if((s[i] == s[i - 1]) || (s[i] == s[i - 1] + 1) || (s[i] == s[i - 1] - 1))
        {
            string tmp;
            tmp += s[i-1];
            tmp += s[i];
            for(j = i + 1; j < n; j ++)
            {
                if((s[j] == s[j - 1]) || (s[j] == s[j - 1] + 1) || (s[j] == s[j - 1] - 1)) tmp += s[j];
                else break;
            }
            int t = 0;
            char str = 'z';
            for(int q = 0; q < tmp.size(); q ++) 
            {
                t += tmp[q] - 'a' + 1;
                if(q % 2 == 0) str = min(str, tmp[q]);
            }
            if(tmp.size() % 2 == 0) res += t;
            else if(tmp.size() == 3) res += max(t - (tmp[0] - 'a' + 1), t - (tmp[tmp.size()-1] - 'a' + 1));
            else res += t - (str - 'a' + 1); 
            i = j;
        }
    }
    cout<<res<<endl;
    return 0;
}

第三题:完全二叉树构造

题目描述:

小红想构造一个总共 n n n 个节点完全二叉树,该二叉树满足以下两个性质:

  1. 所有节点的权值为 1   n 1~n 1 n 的一个排列
  2. 除了根节点以外,每个节点的权值和它父亲的权值的乘积为偶数。
    请你帮小红构造出这个二叉树,并按层序遍历的方式打印所有节点。

输入描述:

一个正整数 n n n,代表二叉树的节点数量。
2 < n < 1 0 5 2\lt n \lt 10^5 2<n<105

输出描述:

输出一行 n n n个正整数,代表小红构造的二叉树的层序遍历的序列。
示例1

输入
4
输出
2 4 3 1
说明
这棵树的结构如下:
2
/ \
4 3
/
1
显然,任意节点和它父亲权值的乘积都是偶数

思路:

奇数节点全部放叶子上 剩下的放偶数节点

AC代码:
#include<bits/stdc++.h>
using namespace std;

int n;

int main()
{	
	cin >> n;
	vector<int> tr(n + 1, 0);
	vector<int> odd, even;
	for(int i = 1; i <= n; i++)
	{
		if(i % 2 == 0) even.push_back(i);
		else odd.push_back(i);
	}
	for(int i = n; i > 0; i--)
	{
		if(odd.empty())
		{
			tr[i] = even.back();
			even.pop_back();
		} 
		else 
		{
			tr[i] = odd.back();
			odd.pop_back();
		}
	}
	for(int i = 1; i <= n; i++) cout << tr[i] << " ";
	return 0;
}

第四题:过沼泽地

题目描述:

小红来到了一片沼泽地的岸边,她希望能通过这片沼泽地。
这个沼泽地地图用一个矩阵进行表示。1代表沼泽,0代表平地。小红刚开始在矩阵的左上角,她需要从右下角离开地图。已知进入地图和离开地图的时间可以忽略。小红可以向左、向右或者向下走。
当小红从沼泽进入沼泽,或者平地进入平地时,需要花费1单位时间。
当小红从沼泽进入平地,或者平地进入沼泽,由于需要更换装备,所以要花2单位时间。
小红可以从左上角进入地图,从右下角离开地图。
小红想知道,经过这片沼泽地,最少需要花费多少单位时间。

输入描述:

第一行输入两个正整数 n n n m m m,用空格隔开,代表矩阵的行数和列数。
接下来的 n n n 行,每行输入 m m m 个正整数 a i , j a_{i,j} ai,j,用来表示矩阵。
2 ≤ n , m ≤ 500 , 0 ≤ a i , j ≤ 1 2\leq n,m\leq500 , 0\leq a_{i,j}\leq1 2n,m500,0ai,j1

输出描述:

输出一个正整数,代表经过沼泽地的最少时间。

示例1

输入
3 3
1 0 0
1 1 1
0 0 1
输出
4
说明
从左上角进入,往下走一次,往右走两次,往下走一次,到右下角。后花费4单位时间。
可以证明,这样花费的时间一定是最小的。

思路:

正常DP即可

AC代码
#include <bits/stdc++.h>
using namespace std;
const int N = 510;

int n,m;
int g[N][N];
int f[N][N];

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>g[i][j];
	memset(f,0x3f,sizeof f);
	f[1][1] = 0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(j + 1 <= m) f[i][j] = min(f[i][j], f[i][j + 1] + (g[i][j] == g[i][j+1] ? 1 : 2));
			if(i - 1 >= 0) f[i][j] = min(f[i][j], f[i - 1][j] + (g[i][j] == g[i - 1][j] ? 1 : 2));
			if(j - 1 >= 0) f[i][j] = min(f[i][j], f[i][j - 1] + (g[i][j] == g[i][j - 1] ? 1 : 2));
		}
	}
	cout<<f[n][m]<<endl;
	return 0;
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言面试八股文是指在春季招聘中常见的C语言相关的面试题目和知识点。下面是一份常见的C语言面试八股文,供您参考: 1. C语言的基本数据类型有哪些? C语言的基本数据类型包括整型、浮点型、字符型和指针型。 2. 请介绍一下C语言中的变量和常量。 变量是用来存储数据的内存位置,可以通过变量名来访问和修改其值。常量是指在程序执行过程中不会改变的值。 3. 什么是数组?请介绍一下C语言中的数组。 数组是一种存储相同类型数据的集合,通过索引来访问数组中的元素。在C语言中,数组的大小在定义时就需要确定,并且数组的下标从0开始。 4. 请介绍一下C语言中的指针。 指针是一个变量,其值为另一个变量的地址。通过指针可以直接访问和修改内存中的数据。使用指针可以提高程序的效率和灵活性。 5. 请介绍一下C语言中的函数。 函数是一段完成特定任务的代码块,可以通过函数名来调用执行。函数可以接收参数并返回一个值,也可以不接收参数或不返回值。 6. 请介绍一下C语言中的流程控制语句。 C语言中的流程控制语句包括条件语句(if-else语句、switch语句)、循环语句(for循环、while循环、do-while循环)和跳转语句(break语句、continue语句、goto语句)。 7. 请介绍一下C语言中的结构体。 结构体是一种自定义的数据类型,可以包含多个不同类型的成员变量。通过结构体可以将多个相关的数据组织在一起。 8. 请介绍一下C语言中的文件操作C语言中的文件操作主要包括打开文件、读写文件和关闭文件。可以使用标准库函数来进行文件操作,如fopen、fread、fwrite、fclose等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值