关于昨天的华为机试

呜呜,吊点了~o(╥﹏╥)o

在考试之前,怎么估摸着能写一道简单题,结果没想到的是,自己太异想天开了。

华为总共分三题:简单 中等 困难

分数: 100 200 300

第一题,题目就给我看懵了,题目简述如下:

现有芯片可以走A,B两种业务,芯片对业务容量的约束如下:

【1】A业务容量为2.5G,一个芯片可以配4个该业务;

【2】B业务容量为10G,一个芯片可以配1个该业务;

【3】该芯片配置了业务A就不能配置业务B;

【4】不能跨芯片占用资源,不能既占用一块芯片,又占用另一块芯片;

【5】保证最少芯片资源,从小到大按芯片编号配置,且优先使用已经用了的芯片。

业务容量最小为2.5G,以该容量为单位,一个芯片化为4个资源区,资源区编号为1,2,3,4.

现在有M块芯片,用户经过配置后,求输出的最后一块芯片对应的芯片编号以及芯片资源ID。

没有可用的资源返回0,0;当正好用B芯片占用一块芯片时,资源ID为1。

————————————————分割线——————————————————————

就这第一道题,逛理解就花了我近20分钟,结果终于花了半小时写完了代码,一敲进去,告诉我只通过了85%!于是,心想这应该很容易调吧,暂时先放弃,看看第三题,因为第三题好像以前写到过~

————————————————分割线——————————————————————

第三题 

在一棵二叉树中找出完全相同的两棵子树(子树层数必须大于或者等于2)。如果存在多对子树完全相同,返回层数最大的子树,不存在就输出“-1”。

——————————————————分割线————————————————————

于是一顿操作猛如虎,又是创建树,又是搞个遍历,又是dfs的,结果一检测,编译失败!!!而此时又浪费了我30分钟,因为贼心不死,又找了10分钟左右的错误,发现代码是在太长了,自己都快看花了,啥也没改出来,还是返回做第一题吧.....至此,我的心凉了大半

————————————————分割线——————————————————————

本来想着,第一题调试很简单,一开始在官方的调试里捣鼓半天没搞出什么玩意,然后导入自己本地的IDE,终于发现有一个样例没过,就是 0 0 这个边界没能判断正确。可能一时心急,最后只有5分钟了,还是没能改出来。

气人的是,一切都结束的时候,知道哪里出问题了!!

——————————————————总结——————————————————————

此次考试给了我当头一棒,可以说是满盘皆输了,总结了一下失败的原因:

1.题目还是得多刷,思路还不够打开;

2.时间把握,以及题目安排上没能做好合理计划,最起码 cout 样例就能得到一部分分数,而我却没有变通;

————————————————————回顾————————————————————

今天,把第一题改出来了:这次应该没错了,虽然已经晚了,哎

#include<iostream>
#include<vector>

using namespace std;

int num1;//芯片数量
int num2;//任务数量
char tasktype;//任务种类
void deal(vector<char>tk, int num2,int num1)
{
	vector<int>xp(num1, 4);
	//计数
	int countA = 0;
	int countB = 0;
	//位置
	int w1 = 0;//芯片位置
	int w2 = 0;//资源ID位置
	for (char cc : tk)
	{
		if (cc == 'A')countA++;
		if (cc == 'B')countB++;
	}
	if (countA + countB * 4 > num1 * 4)
	{
		cout << 0 << endl;
		cout<< 0 << endl;
	}
	else
	{
		for (int i = 0; i < num2; i++)
		{
			for (int j = 0; j < num1; j++)
			{
				if (xp[j] != 0 && tk[i] == 'A')
				{
					xp[j]--;
					w1=j+1;
					w2 = 4 - xp[j];
					break;
				}
				else if (xp[j] == 0 && tk[i] == 'A')
					continue;
				else if (xp[j] == 4 && tk[i] == 'B')
				{
					xp[j] = 0;
					w1=j+1;
					w2 = 1;
					break;
				}
				else if (xp[j] != 4 && tk[i] == 'B')
					continue;
			}
		}
		cout << w1 << endl;
		cout << w2 << endl;
	}
	
}
int main()
{
	while (cin >> num1 >> num2)
	{
		vector<char>task;
		for (int i = 0; i < num2; i++)
		{
			cin >> tasktype;
			task.push_back(tasktype);
		}
		deal(task,num2,num1);
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值