8.12网易互娱 Ac代码 + 题目描述
网易互娱 游戏研发工程师 笔试题
第二次发帖,也是网易第二次笔试,依然是4道做出来3道。哎,其实不是自己实力涨了,是网易笔试考察的主要是编程基本功,这次笔试就感觉没有深入考察算法,就是给一个游戏场景,写一个小任务。
再接再厉,秋招不易,算法得练!
第4题的大神,可以分享下题目和代码,谢谢啦!
- 七星不靠
147 | 258 | 369
万 | 饼 | 条
上述9张数字牌,配合(万 | 饼 | 条),从中随便丢掉2张,剩下的牌,是可以胡牌的。
现在,输入N个7张牌,判断能不能胡牌。
#include <bits/stdc++.h>
using namespace std;
bool check(int i, unordered_map<int, char> &num2tp)
{
char tt = 'A';
for (int i = 1; i < 10; i += 3)
{
if (num2tp.find(i) != num2tp.end())
{
if (tt == 'A')
tt = num2tp[i];
else
{
if (tt != num2tp[i])
{
printf("NO\n");
return false;
}
}
}
}
return true;
}
int main(int argc, char const *argv[])
{
int t;
cin >> t;
int num;
char tp;
while (t--)
{
unordered_map<int, char> num2tp;
unordered_set<char> allTypeOk;
bool ok = true;
for (int i = 0; i < 7; ++i)
{
scanf("%d%c", &num, &tp);
allTypeOk.insert(tp);
if (num2tp.find(num) != num2tp.end())
ok = false;
else
num2tp[num] = tp;
}
if (!ok || allTypeOk.size() != 3)
printf("NO\n");
else
{
bool ok = check(1, num2tp);
if (!ok)
continue;
ok = check(2, num2tp);
if (!ok)
continue;
ok = check(3, num2tp);
if (!ok)
continue;
printf("YES\n");
}
}
return 0;
} 2. 行列最大和 删除
给你一个N*N的矩阵,每次删除(行列和)最大的一行、一列,直到删完。求,每一步删除的行i和列j。请注意,行列交点处的数字,求和只算一次。
#include <bits/stdc++.h>
using namespace std;
void dfs(vector<vector<int>> &nums, vector<int> &colSum, vector<int> &rowSum)
{
if (nums.size() == 0)
return;
if (nums.size() == 1)
{
printf("1 1\n");
return;
}
int maxI = 0, maxJ = 0, maxSum = -1;
for (int i = 0; i < rowSum.size(); ++i)
{
for (int j = 0; j < colSum.size(); ++j)
{
if (rowSum[i] + colSum[j] - nums[i][j] > maxSum)
{
maxSum = rowSum[i] + colSum[j] - nums[i][j];
maxI = i, maxJ = j;
}
}
}
printf("%d %d\n", maxI + 1, maxJ + 1);
// delete row
for (int j = 0; j < colSum.size(); ++j)
{
colSum[j] -= nums[maxI][j];
}
nums.erase(nums.begin() + maxI);
rowSum.erase(rowSum.begin() + maxI);
// delete col
for (int i = 0; i < rowSum.size(); ++i)
{
rowSum[i] -= nums[i][maxJ];
}
colSum.erase(colSum.begin() + maxJ);
for (int i = 0; i < nums.size(); ++i)
{
nums[i].erase(nums[i].begin() + maxJ);
}
dfs(nums, colSum, rowSum);
}
int main(int argc, char const *argv[])
{
int n;
cin >> n;
vector<vector<int>> nums(n, vector<int>(n));
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
scanf("%d", &nums[i][j]);
}
vector<int> colSum(n, 0);
vector<int> rowSum(n, 0);
for (int j = 0; j < n; ++j)
{
for (int i = 0; i < n; ++i)
{
colSum[j] += nums[i][j];
rowSum[i] += nums[i][j];
}
}
dfs(nums, colSum, rowSum);
return 0;
} 3. 明日之后 找出自身耗费时间最长的活动
比如,想要造一个柜子,需要3块木板,木板有需要伐木,和找树枝,大概这个样子,理解下父与子。
说白了,用括号表示就是,((())) 和 ((()()())()),所以要用栈啊。
#include <bits/stdc++.h>
using namespace std;
stack<pair<long long, long long>> st;
int main(int argc, char const *argv[])
{
long long T;
cin >> T;
while (T--)
{
long long n;
cin >> n;
long long t, e, s;
long long id = -1, maxTime = -1;
bool preIsEnd = false;
for (long long i = 0; i < n; ++i)
{
scanf("%lld %lld %lld", &t, &e, &s);
if (!s)
{
st.push(make_pair(t, 0));
preIsEnd = false;
}
else
{
pair<long long, long long> &item = st.top();
long long allTime = t - item.first;
long long selfTime = allTime - item.second;
if (selfTime > maxTime || selfTime == maxTime && id > e)
{
id = e;
maxTime = selfTime;
}
st.pop();
if (!st.empty())
{
if (preIsEnd)
st.top().second += allTime;
else
st.top().second += selfTime;
}
preIsEnd = true;
}
}
printf("%lld\n", id);
while (!st.empty())
st.pop();
}
return 0;
}

