2019腾讯实习生提前批笔试题解答

牛家村的货币是一种很神奇的连续货币。

他们货币的最大面额是n,并且一共有面额为1,面额为2.....面额为n,n种面额的货币。

牛牛每次购买商品都会带上所有面额的货币,支付时会选择给出硬币数量最小的方案。

现在告诉你牛牛将要购买的商品的价格,你能算出牛牛支付的硬币数量吗? (假设牛牛每种面额的货币都拥有无限个。)

输入格式

共一行,包含两个整数n和m,分别表示货币的最大面额以及商品的价格。

输出格式

一个整数表示牛牛支付的硬币数量。

数据范围

1≤n≤1051≤n≤105,
1≤m≤1091≤m≤109

输入样例1:

6 7

输出样例1:

2

输入样例2:

4 10

输出样例2:

3

 

这是一道简单的贪心题目

#include 

int main()
{
	int n, m;
	std::cin >> n >> m;
	if (n >= m) {
		std::cout << 1 << std::endl;
	}
	else {
		if (m%n == 0)
			std::cout << m / n << std::endl;
		else
			std::cout << m / n + 1 << std::endl;

	}
}

 

妞妞最近迷上了王者荣耀。

小Q得到了一个奇妙的数列,这个数列有无限多项,数列中的第 i 个数字为i∗(−1)ii∗(−1)i,比如数列的前几项为-1,2,-3,4,-5…

小Q兴奋把这个数列拿去给妞妞看,并希望借此邀请妞妞吃饭。

妞妞想了想,对小Q说:“对于这个数列,我每次询问你一个区间,你在1秒内把这个区间里的数字的和告诉我,如果你答得上来我就跟你一起去吃饭。”

由于妞妞最近沉迷王者荣耀,已经很久都没理过小Q了,所以小Q不想失去这次珍贵的机会,你能帮帮他吗?

输入格式

第一行,一个整数 q,表示妞妞的询问次数。

接下来 q 行,每行两个整数 l 和 r,表示妞妞询问的区间的左端点和右端点。

输出格式

共 q 行,每行一个整数,表示妞妞询问的区间和。

数据范围

1≤q≤1051≤q≤105,
1≤l≤r≤1091≤l≤r≤109

输入样例1:

4
2 4
2 2
3 3
1 5

输出样例1:

3
2
-3
-3

输入样例2:

1
1 1000000000

输出样例2:

500000000

 

这是一道特殊性的题目,充分利用题目的特殊性解答,注意这里下标是从1开始的,与熟悉的习惯不同,需要仔细调试程序解答

#include 

int main()
{
	int K;
	std::cin >> K;
	while (K--) {
		int l, r, res;
		std::cin >> l >> r;             // -1 2 -3 4 -5
		if (l % 2)                      // l=2 r=4
			res = (r - l + 1) / 2;
		else {
			res = (r - l + 1) / 2;
			res = res * -1;
		}
		//std::cout << res << std::endl;
		if ((r - l + 1) % 2 == 1) {
			if (r % 2)
				res += -r;
			else
				res += r;
		}
		std::cout << res << std::endl;

	}
}

 

小Q和牛妹参加一个剪刀石头布的游戏,游戏用卡片来玩,每张卡片是剪刀,石头,布中的一种,每种类型的卡片有无限个。

牛妹从中选了n张卡片排成一排,正面朝下,小Q也会选择n张卡片排成一排,然后小Q和牛妹的卡片会依次进行比对,第一张对第一张,第二张对第二张…

如果小Q赢,小Q会得到一分,现在已知牛妹的每一张牌以及小Q最终的得分 s,请问小Q有多少种选择卡片的方案(多少不同的排列)

输入格式

第一行包含两个整数 n 和 s。

第二行包含 n 个整数,表示牛妹的每张卡片,每个数在[0,2]之间,0代表石头,1代表布,2代表剪刀。

输出格式

输出一个整数,表示总方案数对109+7109+7取模后的值。

数据范围

1≤n≤20001≤n≤2000,
0≤s≤20000≤s≤2000

输入样例:

3 2
0 1 2

输出样例:

6

 

小Q在进行射击气球的游戏,如果小Q在连续T枪中打爆了所有颜色的气球,将得到一只QQ公仔作为奖励。(每种颜色的球至少被打爆一只)。

这个游戏中有m种不同颜色的气球,编号1到m。

小Q一共有n发子弹,然后连续开了n枪。

小Q想知道在这n枪中,打爆所有颜色的气球最少用了连续几枪?

输入格式

第一行包含两个整数n和m。

第二行包含n个整数,分别表示每一枪打中的气球的颜色,0表示没打中任何颜色的气球。

输出格式

一个整数表示小Q打爆所有颜色气球用的最少枪数。

如果小Q无法在这n枪打爆所有颜色的气球,则输出-1。

数据范围

1≤n≤1061≤n≤106,
1≤m≤20001≤m≤2000

输入样例:

12 5
2 5 3 1 3 2 4 1 0 5 4 3

输出样例:

6

样例解释

有五种颜色的气球,编号1到5。

游客从第二枪开始直到第七枪,这连续六枪打爆了5 3 1 3 2 4这几种颜色的气球,包含了从1到5的所有颜色,所以最少枪数为6。

 

最后一道题目是一道双指针滑窗的题目,第一个指针先放在开头,第二个指针从开头遍历到末尾,只有在满足条件的情况下才能移动第一个指针。

这里要注意,这题目有一些特殊性,就是范围恰好是1-m,除了0之外的。所以要注意0的排除,另外判断条件成立用一个num变量,判断num==m即可

#include 
using namespace std;

const int N = 1000010, M = 2010;
int arr[N], mp[M];

int main()
{
	int n, m;
	scanf("%d %d", &n, &m);
	for (int i = 0; i < n; i++)
		scanf("%d", &arr[i]);
	bool flag = false;
	int res = n + 1;
	int colors = 0;
	int j = 0;                   // j是前一个指针
	                              // i是后一个指针
	for (int i = 0; i < n; i++) {

		if (arr[i]>0 && mp[arr[i]]==0)
			colors++;
		mp[arr[i]]++;
		
		if (colors == m) {
			flag = true;
			while (arr[j] == 0 || mp[arr[j]] > 1) {
				mp[arr[j]]--;
				j++;
			}

			res = (i - j + 1 > res ? res : i - j + 1);
		}
	}
	if (flag)
		cout << res << endl;
	else
		cout << -1 << endl;

	
}

 

你可能感兴趣的:(算法)