网易 8.20 笔试
题目链接
题目顺序和链接里的图不是一样的, 顺序是链接里的 3 2 1 4
第一题
bfs 但是不知道哪有问题只过了 86.. 有无大佬帮忙找一下 bug
#include <bits/stdc++.h>
using namespace std;
//#define int long long
int a, b;
signed main()
{
cin >> a >> b;
queue<pair<int,int>> q;
set<pair<int,int>> vis;
int step = 0;
q.push({a, b});
vis.insert({a, b});
for (; ;) {
if (q.empty()) break;
step++;
int size = q.size();
for (int i = 0; i < size; i++) {
auto tmp = q.front(); q.pop();
int ta = tmp.first, tb = tmp.second;
//cout << ta << " " << tb << endl;
if (ta == 0 || tb == 0 || ta % tb == 0 || tb % ta == 0) {
//cout << "finally: " << ta << " " << tb << endl;
cout << step - 1 << endl; return 0;
}
int t = 10;
while (ta >= t) {
int na = ta / t * (t / 10) + ta % (t / 10);
if (vis.find({na, tb}) == vis.end())
{q.push({na, tb}); vis.insert({na, tb});}
t = t * 10;
}
int na = ta / t * (t / 10) + ta % (t / 10);
if (vis.find({na, tb}) == vis.end())
{q.push({na, tb}); vis.insert({na, tb});}
t = 10;
while (tb >= t) {
int nb = tb / t * (t / 10) + tb % (t / 10);
if (vis.find({ta, nb}) == vis.end())
{ q.push({ta, nb}); vis.insert({ta, nb}); }
t = t * 10;
}
int nb = (tb / t * (t / 10)) + (tb % (t / 10));
if (vis.find({ta, nb}) == vis.end())
{ q.push({ta, nb}); vis.insert({ta, nb}); }
}
//cout << "----------------" << endl;
}
cout << -1 << endl;
return 0;
} 第二题
扫一遍就行, 保证奇数偶数位都是最大的就行, 特判一下所有数相同的情况 就是那个数据量似乎比题面描述大.. 恶心了好长时间
#include <iostream>
using namespace std;
#define int long long
const int N = 2e5 + 5;
int n, a[N];
signed main()
{
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
int mx1 = 0, mx2 = 0;
int res = 0;
for (int i = 1; i <= n; i++) {
if (i % 2) mx1 = max(mx1, a[i]);
else mx2 = max(mx2, a[i]);
}
for (int i = 1; i <= n; i++) {
if (i % 2) res += mx1 - a[i];
else res += mx2 - a[i];
}
if (mx1 == mx2) res += n / 2;
cout << res << endl;
return 0;
} 第三题
就贪心的把所有能改的都改了, 过了 37 代码忘存了, 反正也不会... 有无大佬来个思路
第四题
DP 过的比暴力少就离谱, 好歹暴力还过了 57 这里就只贴一下 DP 的代码, 希望有大佬帮找一下 bug
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 5;
int n, a[N], f[N];
signed main()
{
int res = 0;
map<int,int>mp;
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
if (a[1] == a[3] and a[1] > a[2])
f[3] = 1;
mp[a[1]] = 1, mp[a[2]] = 2, mp[a[3]] = 3;
for (int i = 3; i <= n; i++) {
int last = mp[a[i]];
f[i] = f[last];
// if (i == 5) cout << f[i] << " " << f[last] << endl;
for (int j = last + 1; j < i; j++)
if (a[j] < a[last]) f[i]++;
mp[a[i]] = i;
res += f[i];
//if (i == 5) cout << res << endl;
}
cout << res << endl;
return 0;
} #网易笔试##做完网易2023秋招笔试题,我裂开了#
查看14道真题和解析