网易有道21届秋招提前批(嵌入式开发工程师)下

题目三:有三种难度的题目,难度分别为Easy,Medium,Hard。现在你总共有E+EM+M+MH+H道题,各个字符串的含义如下:
1.E表示有E道题目难度为Easy
2.EM表示有EM道题目难度可以为Easy或Medium
3.M表示有M道题目难度为Medium
4.MH表示有MH道题目难度可以为Medium或Hard
5.H表示有H道题目难度为Hard
你要用这些题目出尽量多的模拟赛,为了保证题目质量且含有一定的区分度,每场模拟赛需要包含Easy,Medium,Hard三种难度的题目各一道,求你最多能出多少场模拟赛
输入描述:
一行五个整数E,EM,M,MH,H
0<=E+EM+M+MH+H<=10^18
输出描述:
一行一个数字表示答案
示例1:
输入:
2 2 1 2 2
输出: 3
说明:E+EM+H、E+MH+H、EM+M+MH

#include
#include
using namespace std;
void printRes(long long a[], long long b)   //打印结果
{
	while (!(a[0] + a[1] == 0 || a[1] + a[2] + a[3] == 0 || a[3] + a[4] == 0))
		//还可以组成模拟赛
	{
		//考虑E和EM,EM、M和MH,MH和H间,多的先挑选,减去
		if (a[1] > a[0]) a[1]--;
		else a[0]--;
		//--------------------------------------------------
		if (a[2] > a[1] && a[2] > a[3])
			a[2]--;
		else if (a[1] < a[3])
			a[3]--;
		else        //EM和MH相等时,优先减EM,防止a[4]过界<0
			a[1]--;
		//--------------------------------------------------
		if (a[3] > a[4])  a[3]--;
		else a[4]--;
		//-----------------------减去三道题后构成一套卷-----
		b += 1;   //构成一套题,b++
		if (a[0] + a[1] + a[2] + a[3] + a[4] < 3) break;  //不够三道题,跳出循环,如01010
	}
	cout << b << endl;
}
int main()
{
	long long a[5];
	while (cin >> a[0] >> a[1] >> a[2] >> a[3] >> a[4])
	{
		long long b[3] = { a[0] ,a[2] ,a[4] };
		long long* max = min_element(b, b + 3);   //初始输出  
		for (int i = 0; i < 5; i+=2)              //先减去直接可以E+M+H构成的题
		{
			a[i] = a[i] - *max;        //需要做处理的数组a
		}
		printRes(a, *max);
	}
	return 0;
}

题目四:牛牛有一块“ 2* n”的空白瓷砖并且有足够多的1* 2和2*3两种类型的地毯(地毯可以旋转),现在他想在满足以下条件:地毯之间不能相互重叠,地毯不能铺出瓷砖外以及不能有空隙下铺满整个瓷砖。问你一共有多少种不同的方案并且结果模上10007输出
输入描述:
第一行输入一个正整数T,表示有T组数据
接下来T行,每行输入一个正整数n
1<=T<=100
1<=n<=100000
输出描述:
输出T行,每一行对应每组数据的输出
示例1:
输入:
4
1
2
3
5
输出:
1
2
4
13

#include
#include
using namespace std;
int max(int i, int j) {         // 定义max()函数									
	if (i >= j) return i;
	else return j;
}
int main()
{
	vector<int>res;       //输出
	int T;                //输入T组数据
	cin >> T;
	int dp[100001];       //dp[1]到dp[100000]为对应n的方案数
	dp[1] = 1;
	dp[2] = 2;
	dp[3] = 4;            //初始化
	for (int i = 4; i <= 100000; i++)               //同Fibonacci数列
	{
		dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];  //递归
	}

	for (int i = 0; i < T; i++)    //输入n
	{
		int n;
		cin >> n;
		res.push_back(dp[n]);
	}
	for (int i = 0; i < res.size(); i++)     //输出方案数
	{
		cout << res.at(i)%100007 << endl;
	}
	return 0;
}

你可能感兴趣的:(C++)