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;
}
- 一个游戏,有两种攻击方式,直线(横,竖,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。已知所有水果的位置和篮子的初始位置。选取最佳路线接水果,使得分数最高。没思路
上一篇: MySQL优化COUNT()查询
下一篇: 广东月饼品牌有哪些?这些品牌你都吃过吗?
推荐阅读