微软线上笔试-2015-4-3(1,2题) Magic Box && Professor Q's Software

写在前面:

http://blog.csdn.net/michael_kong_nju/article/details/44872519

关于4.3号的微软线上挑战赛,感觉自己还是刷题刷少了,表现在几个方面:1. 编程经验不足。2. 算法的使用不灵活。所以下面还是要加强OJ的训练,

把Leetcode上的题多做做。后面又把4道题仔细的编写调试了一下,希望和我情况类似的同学也能加紧代码的训练。

1. 第一题的原题是:

The circus clown Sunny has a magic box. When the circus is performing, Sunny puts some balls into the
box one by one. The balls are in three colors: red(R), yellow(Y) and blue(B). Let Cr, Cy, Cb denote the numbers of red, yellow, blue balls in the box. Whenever the differences among Cr, Cy, Cb happen to be x, y, z, all balls in the box vanish. Given x, y,
z and the sequence in which Sunny put the balls, you are to find what is the maximum number of balls in the box ever.

For example, let‘s assume x=1, y=2, z=3 and the sequence is RRYBRBRYBRY. After Sunny puts the first 7 balls, RRYBRBR,
into the box, Cr, Cy, Cb are 4, 1, 2 respectively. The differences are exactly 1, 2, 3. (|Cr-Cy|=3, |Cy-Cb|=1, |Cb-Cr|=2) Then all the 7 balls vanish. Finally there are 4 balls in the box, after Sunny puts the remaining balls. So the box contains 7 balls at
most, after Sunny puts the first 7 balls and before they vanish.

输入

Line 1: x y z

Line 2: the sequence consisting of only three characters ‘R‘, ‘Y‘ and ‘B‘.

For 30% data, the length of the sequence is no more than 200.

For 100% data, the length of the sequence is no more than 20,000, 0 <= x, y, z <= 20.

输出

The maximum number of balls in the box ever.

样例输入:

1 2 3
RRYBRBRYBRY

样例输出:

7

其实这道题比较简单了,但是提交的时候总有些测试用例过不去,包括我自己刚开始的时候也是,最后因为实在找不出来也就没有继续下去。后面想了想大概是有下面几点需要注意的:

1. 因为球在一满足条件下会vanish,而这里的条件是选择性的精确匹配,即|cr-cy|可以等于1,2,3中的任意一个,而其另外两个的差值属于其它两个就可以了。

2. vanish在将所有的球都放进去的时候不止发生一次,所以要循环的去判断。

3. 有可能最后剩下的那个才是最大的,所以需要把所有的球都放完后将剩下的球和之前vanish的最大值做比较。

如果能够将上面所有的条件都考虑了应该就没有问题了,下面是具体的实现:

#include <iostream>         //by Lingtao Kong 2015/0404
#include <string>
#include <cmath>
void sort_int(int &r1, int &r2, int &r3)          //提前将x,y,z和差值进行排序就可以一次进行判断而不需要讨论了。
{
	if (r1 > r2)swap(r1, r2);
	if (r1 > r3)swap(r1, r3);
	if (r2 > r3)swap(r2, r3);
}
int print_max(int x, int y, int z, string box)
{
	sort_int(x, y, z); // to set x < y < z
	int red=0, blue=0, yello=0;
	int r1, r2, r3;
	int max = 0;
	int first = -1;
	for (int i = 0; i < box.size(); i++)
	{
		switch (box[i])
		{
		case 'R':
			red++; break;
		case 'Y':
			yello++; break;
		case 'B':
			blue++; break;
		default:
			break;
		}
		r1 = abs(red - blue);
	        r2 = abs(red - yello);
		r3 = abs(blue - yello);
		sort_int(r1, r2, r3);
		if (r1 == x && r2 == y && r3 == z)
		{
			max = (i - first > max) ? (i - first) : max;          //使用的是下标的差值来计算个数的,有的同学使用的是三个球颜色之和也很好。
			first = i;
			red = 0;
			blue = 0;
			yello = 0;
		}
	}
	return (max > box.size()-1 - first) ? (max) : (box.size()-1 - first);   //和剩下的进行比较
}
void  main(void)
{
	int x, y, z;
	cin >> x >> y >> z;
	string ball;
	cin >> ball;
	cout << print_max(x, y, z, ball) << endl;
}

2. 第二道题

第二道题的题目比较复杂,如果你想看看英文我把他放在下面了:

描述

Professor Q develops a new software. The software consists of N modules which are numbered from 1 to N. The i-th module will be started up by signal Si.
If signal Si is generated multiple times, the i-th module will also be started multiple times. Two different modules may be started up by the same signal. During its lifecircle,
the i-th module will generate Ki signals: E1, E2,
..., EKi. These signals may start up other modules and so on. Fortunately the software is so carefully designed that there is no loop in the starting chain of modules,
which means eventually all the modules will be stoped. Professor Q generates some initial signals and want to know how many times each module is started.

输入

The first line contains an integer T, the number of test cases. T test cases follows.

For each test case, the first line contains contains two numbers N and M, indicating the number of modules and number of signals that Professor Q generates initially.

The second line contains M integers, indicating the signals that Professor Q generates initially.

Line 3~N + 2, each line describes an module, following the format S, K, E1, E2,
... , EK. S represents the signal that start up this module. K represents the total amount of signals that are generated during the lifecircle of this module. And E1 ...
EK are these signals.

For 20% data, all N, M <= 10

For 40% data, all N, M <= 103

For 100% data, all 1 <= T <= 5, N, M <= 105, 0 <= K <= 3, 0 <= S, E <= 105.

Hint: HUGE input in this problem. Fast IO such as scanf and BufferedReader are recommended.

输出

For each test case, output a line with N numbers Ans1, Ans2,
... , AnsN. Ansi is the number of times that the i-th module is started. In case the answers may
be too large, output the answers modulo 142857 (the remainder of division by 142857).

样例输入
3
3 2
123 256
123 2 456 256
456 3 666 111 256
256 1 90
3 1
100
100 2 200 200
200 1 300
200 0
5 1
1
1 2 2 3
2 2 3 4
3 2 4 5
4 2 5 6
5 2 6 7
样例输出
1 1 3
1 2 2
1 1 2 3 5

其实这道题目的难点我认为有下面几个方面:

1. 对输入控制的要求较高,我们需要从控制台根据规范将所有的变量进行对应输入,同时还要进行相应大小变量的定义。

2. 对题目的变量的理解比较耗时,因为首先要把每个输入项搞懂。

如果对题目的意思很明白了,那么在有效的进行输入之后,设计算法就很简单了,只需要一个队列,然后将出队列的时候看激活的是哪个module并且将转换的数据

再次入队就可以了。下面是代码的实现,主要使用了动态数组以及queue数据结构。

/*
By Lingtao Kong 2015/04/04
*/
#include <iostream>
#include <queue>
using namespace std;
int N;  // 第一行输出的测试用例的数目
#define MAX_N 100010
#define MAX_M 100010
#define K 5  //每一行最多就只有5列,其中3个输出
int  (*modules_)[MAX_N][K];  //定义了一个动态的三维数组用来保存所有测试用例对应的转换模型。
int *modules_num, *signals_num;   //动态的数组用来保存每个测试用例对应的模块个数以及信号数量
int(*signals)[3];  //保存所有的输入输入的信号

/*从终端读入数据*/
void read_data()
{
	memset(modules_, -1, sizeof(modules_));
	for (int n = 0; n < N; n++)
	{

		cin >> modules_num[n] >> signals_num[n];   //输入第n个测试用例的 N M
		for (int i = 0; i < signals_num[n]; i++)
			cin >> signals[n][i];
		//输入第n个测试用例的第m个模块的对应的转换规则
		for (int m = 0; m < modules_num[n]; m++)
		{
			cin >> modules_[n][m][0] >> modules_[n][m][1];
			for (int e = 0; e < modules_[n][m][1]; e++)
				cin >> modules_[n][m][2 + e];
		}
	}
}
/*处理输出,对于每一个测试用例,将signals中的信号对应到刚才建立的模块中去*/
queue<int>qu_sig;
void process()
{
	for (int n = 0; n < N; n++)
	{
		//将初始信号装入队列。
		for (int s = 0; s < signals_num[n]; s++)
		{
			qu_sig.push(signals[n][s]);
		}
		int *result = new int[modules_num[n]];
		memset(result, 0, sizeof(result)*modules_num[n]);
		int element;
		while (!qu_sig.empty())
		{
			element = qu_sig.front();
			for (int m = 0; m < modules_num[n]; m++)
			{
				if (element == modules_[n][m][0])
				{
					result[m]++;
					for (int e = 0; e < modules_[n][m][1]; e++)
						qu_sig.push(modules_[n][m][2 + e]);
				}
			}
			qu_sig.pop();
		}
		for (int i = 0; i < modules_num[n]; i++)
			cout << result[i] << " ";
		cout << endl;
		delete[]result;
	}
}
void main(void)
{
	cin >> N;
	modules_num = new int [N];
	signals_num = new int[N];
	signals = new int[N][3];
	modules_ = new int[N][MAX_N][K];
	read_data();
	process();
	delete[]modules_num;
	delete[]signals_num;
	delete[]signals;
	delete[]modules_;
}

限于篇幅在下一篇会给出第三,四题如果你发现有什么错误或者更好的算法欢迎批评指正。谢谢。

微软线上笔试-2015-4-3(1,2题) Magic Box && Professor Q's Software

时间: 2024-12-27 19:45:41

微软线上笔试-2015-4-3(1,2题) Magic Box && Professor Q's Software的相关文章

记Booking.com iOS开发岗位线上笔试

今晚参加了Booking的iOS职位线上笔试,结束后方能简单归纳一下. 关于测试内容: Booking采用了HackerRank作为测试平台,测试总时长为75分钟,总计4道题. 测试之前我很紧张,因为根据之前参加微软的Online Test经验来看,应该会有一些复杂的算法题.但是事实上Booking测试的题目,前三题均没有涉及高深的算法,都是一些基础的Objective-C和iOS开发的知识,这反而带了更大的困惑,想的太多反而浪费了大量时间. 测试邀请邮件 最后的结果是完成了3/4,因为时间没了

秋招--线上笔试记录

这系列帖子用来记录的我凉凉的线上笔试,第一次笔试让我更加深刻的认识到了自己的不足,以及还有许多知识点没有看,算法这一块我看来还没入门,只能说秋招道路任重而道远.希望去北京的这条路自己可以能走得再快一点. 下面来记录一下,在这次笔试的我的一些问题 单选 1.最短路径:用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低. 2.通过构建有序序列,对于未排序数据,在已排序序

2015微软实习在线笔试题 - Professor Q&#39;s Software

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Professor Q develops a new software. The software consists of N modules which are numbered from 1 to N. The i-th module will be started up by signal Si. If signal Si is generated multiple times, the i-th module

触宝线上笔试2018

题目:有多个case,每个case中有一个案例库,求给定字符串是否是案例库中的子串,若是输出个数. 输入:第一行,输出案例库中字符串的个数N,下面N行数为每一个字符串:给定字符串的个数为M,下面M行为给定字符串 例子: 3 //case1案例库 aaa aaa baa 2 //给定字符串 aa ba 1 //case2 案例库 a 1 //给定字符串 a 输出 3 //aa是案例库1中三个字符串的子串,个数为3 1 //ba是案例库1中第三个字符串的子串,故个数为1 1 //a是案例库2中的字串

微软2016校招笔试 第一场部分题目个人思路

嗯--第一场当时还不知道报名,第二场报上了,拿了250/400,果然分如其人-- 这里包括的是第一场的ABC题,第二场的AB题的题解在另一篇(这些都是自己AC了的),第一场的D和第二场的C至今仍然在WA,不知道怎么回事,到时候也讲讲思路求指点吧. A. Magic Box 这道题并不难做,唯一需要注意的是cx,cy和cz,以及任意两个量的差之间是没有前后关系的(这个事情样例里也告诉你了),所以比较简单的方法就是先把cx,cy,cz排序,然后根据输入串一个一个模拟,然后计算出两两之间的差,排序,比

线上LVS负载均衡请求不转发案例简单解决分析一例

线上某架构组织结构基本如下: 基本架构描述: 前端采用的是lvs+keepalived做负载均衡和高可用,用来转发客户的请求给后端的业务服务器,也就是那4组nginx+tomcat业务服务器.说的更直白一些,那几台nginx+tomcat可以简答理解为lvs的客户端. 故障描述: 其中lvs转发到58.2.12.20这台服务器的时候, ActiveConn的值还有一些,InActConn几乎是没有数值的.为了这个问题纠结了好几天迟迟未能解决,由于刚到公司也不能不解决这些问题哦. 解决思路: 1)

线上MySQL某个历史数据表的分区笔记

背景: 线上的一个历史数据库,业务方反馈经常遇到一个范围查询就导致CPU迅速飙升的情况.拿到他们提供的SQL后,SQL类似下面这种: select * from `order_his` where `xxxx` = '222' AND `XXXX` <> 1 AND order_time > '2016-11-01 00:00:00' AND order_time < '2017-06-01 00:00:00' \G explain看了下发现基本上是全表扫描了,效率太低了,并且他们

转载:APP的上线和推广&mdash;&mdash;线上推广渠道

本文版权归个人所有,如需转载请注明出处http://www.cnblogs.com/PengLee/p/4637080.html 目录 应用商店 互联网开放平台 软件下载中心 媒体社交平台 刷榜推广 应用商店 大家都应该清楚,应用商店应该是App推广渠道中最重要的.也是使用最多的一种.目前应用商店的也有很多,总结起来, 大概有如下几类: 1.手机生产商 小米应用商店.联想乐商店,HTC市场,oppo nearme,魅族市场,moto智件园等 2.三大系统应用商店 Google的Android M

对线上系统维护工作的总结与思考

背景描述:目前在一家网站公司工作,2015年初研发中心部门改革,小组重组,被分配到了网站平台的维护组.下面内容是对近期维护工作的一个总结: 个人感受:以前也在老东家的团队也做线上系统的维护和新产品的研发,由于大家的认真负责,Leader的管理也很到位,线上的系统很少有bug反馈,不管是UI上迭代,还是系统逻辑的升级都很顺畅. 目前负责的平台运行了3年多,可能由于当时逻辑设计问题,也可能是执行问题,发现近期反馈的问题多是逻辑问题,在此对这些问题的原因不做探讨和深究,只是想讲讲面对线上问题的维护工作