欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

20210401雷火游戏笔试题

程序员文章站 2022-03-24 13:15:48
...

1.给你半副牌27张,有四种花色1, 2, 3, 4,数值JQK分别算是11, 12, 13,Ace算数字14,小王大王算15, 16 。求不同的同花顺的个数(大王小王不参与计算)。

思路:把每一种花色分别进行分别统计。对每一种花色进行排序,去重。弹出大小王;之后对每一种花色进行枚举。

#include<iostream>
#include<algorithm>
#include<vector>
#include<unordered_map>
using namespace std;

vector<int> card[5];

int main(){
	for (int i = 0; i < 27; i++){
		int color, val;
		cin >> val >> color;
		if (val == 14) card[color].push_back(1); //把A入队2次
		card[color].push_back(val);
	}

	for (int i = 1; i <= 4; i++){
		sort(card[i].begin(), card[i].end());
		card[i].erase(unique(card[i].begin(), card[i].end()), card[i].end());
		while (card[i].size() && card[i].back() >= 15) card[i].pop_back();
	}

	int res = 0;
	for (int i = 1; i <= 4; i++){
		int len = card[i].size();
		for (int j = 0; j < len - 4; j++){
			int sum = 0;
			int s = card[i][j] * 5 + 10;
			for (int k = 0; k < 5; k++){
				sum += card[i][j + k];
			}
			if (sum == s) res++;
		}
	}

	cout << res << endl;
	
	return 0;
}
  1. 一个游戏,有两种攻击方式,直线(横,竖,45度和135度)和方格(边长为2 * n + 1),给出cnt个怪和他们的位置,计算在边长为300的方形空间内,只攻击一次最多击杀多少怪。

思路:对方形中的怪和横竖直线可以用前缀和思想,斜线可以用枚举,但是这道题我只过了45,。。。
代码如下:

#include<iostream>
#include<algorithm>
#include<vector>
#include<unordered_map>
using namespace std;
int matri[310][310] = {0};
int sum[310][310];

int get_num(int x1, int y1, int x2, int y2){
	int ans = sum[x2][y2] - sum[x1 - 1][y2] - sum[x2][y1 - 1] + sum[x1 - 1][y1 - 1];
	return ans;
}

int main(){
	int n, cnt;
	cin >> n >> cnt;
	int len = n * 2 + 1;
	for (int i = 0; i < cnt; i++){
		int x, y;
		cin >> x >> y;
		matri[x][y] = 1;
	}
	
	sum[0][0] = matri[0][0];
	for (int i = 1; i < 310; i++)
	{
		sum[0][i] = sum[0][i - 1] + matri[0][i];
	}
	for (int i = 1; i < 310; i++)
	{
		sum[i][0] = sum[i - 1][0] + matri[i][0];
	}

	for (int i = 1; i < 310; i++)
	{
		for (int j = 0; j < 310; j++)
		{
			sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + matri[i][j];
		}
	}
	//求出方形里面的最高值
	int res = 0;
	for (int i = 0; i < 310 - len; i++)
	{
		for (int j = 0; j < 310 - len; j++)
		{
			res = max(res, get_num(i, j, i + len - 1, j + len - 1));
		}
	}

	
	//求出直线里面的最高值
	for (int i = 0; i < 301; i++)
	{
		res = max(res, get_num(i, 0, i, 301));
		res = max(res, get_num(0, i, 301, i));
	}
	//斜线
	for (int i = 0; i < 301; i++)	//扫描第一列
	{
		int cnt = 0;
		int j = 0, ii = i; //枚举列  45度线
		while (ii < 301 && j < 301 && ii >= 0 && j >= 0){
			if (matri[ii][j]) cnt++;
			ii++, j++;
		}
		res = max(res, cnt);

		cnt = 0;
		j = 0, ii = i; //枚举列  135度线
		while (ii < 301 && j < 301 && ii >= 0 && j >= 0){
			if (matri[ii][j]) cnt++;
			ii--, j++;
		}
		res = max(res, cnt);

	}

	for (int i = 0; i < 301; i++)	//扫描第一行
	{
		int cnt = 0;
		int j = 0, ii = i; //枚举列  45度线
		while (ii < 301 && j < 301 && ii >= 0 && j >= 0){
			if (matri[j][ii]) cnt++;
			ii++, j++;
		}
		res = max(res, cnt);

		cnt = 0;
		j = 0, ii = i; //枚举列  45度线
		while (ii < 301 && j < 301 && ii >= 0 && j >= 0){
			if (matri[j][ii]) cnt++;
			ii++, j--;
		}
		res = max(res, cnt);

	}
	
	cout << res << endl;
	while (true)
	{

	}
	
	
	return 0;
}

3.接水果游戏,水果接完或者有m次没接着游戏结束。水果下落速度1m/s,篮子移动速度是v。已知所有水果的位置和篮子的初始位置。选取最佳路线接水果,使得分数最高。没思路