网易C++后台开发笔试编程题
第一题
给你n个数,m次询问。 每次询问x出现了多少次。 数据范围好像是1e5;
思路:
可以之间用unordered_map来存一下,当然你也可以自己写哈希;
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef pair<ll, ll> pll;
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
#define MAX_N 100010
int main() {
#ifdef DEBUG
freopen("data.txt", "r", stdin);
#endif // DEBUG
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, m;
cin >> n >> m;
unordered_map<int, int> F;
for(int i = 0, tmp; i < n; i++)
{
cin >> tmp;
F[tmp]++;
}
while(m--)
{
int tmp;
cin >> tmp;
cout << F[tmp] << endl;
}
return 0;
} 第二题
说一个人,有个无限容量的包(初始有m个积木),有n堆积木,第i堆有a[i]个, 每次可以进行 拿走一个 放上去一个 或者啥都不干操作; 问能不能使得最后严格单调递增。 数据范围好像是1e5
思路:
考虑最蠢的办法, 直接保证 第一堆积木有0个, 第二堆有1个, 以此类推
然后求一下所有积木 + m 是否 >= (0 + n - 1) * n / 2, 如果这都凑不够 那铁定凉凉;
如果可以够,还要考虑 如果后面的积木特别多, 前面背包里的积木不够补的情况;
在线维护一下就行了
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef pair<ll, ll> pll;
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
#define MAX_N 100010
int a[MAX_N];
int main() {
#ifdef DEBUG
freopen("data.txt", "r", stdin);
#endif // DEBUG
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while(t--)
{
ll sum = 0, n, m;
cin >> n >> m;
for(ll i = 0; i < n; i++)
{
cin >> a[i];
sum += a[i];
}
sum += m;
if(sum < (n - 1) * n / 2)
{
cout << "NO" << endl;
continue;
}
int flag = 1;
for(int i = 0; i < n; i++)
{
if(i == 0)
{
m += a[i];
}
else
{
if(a[i] > i)
{
m += a[i] - i;
}
else
{
if(m < i - a[i])
{
flag = 0;
break;
}
else
{
m -= i - a[i];
}
}
}
}
if(flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
} 第三题
给你一个数组, 要满足 第i项 大于等于 前i-1项的和。 问你满足这样的最长连续子序列的长度
考虑可以先用前缀和预处理一下,然后在线维护一下即可;
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef pair<ll, ll> pll;
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
#define MAX_N 100010
ll a[MAX_N], sum[MAX_N];
int main() {
#ifdef DEBUG
freopen("data.txt", "r", stdin);
#endif // DEBUG
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while(t--)
{
memset(sum, 0, sizeof(sum));
int n;
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> a[i];
sum[i] += sum[i - 1] + a[i];
}
ll Max = 0, tmp_Max = 0, pre = 0;
for(int i = 1; i <= n; i++)
{
if(a[i] >= sum[i - 1] - pre)
tmp_Max++;
else
{
Max = max(Max, tmp_Max);
tmp_Max = 1;
pre = sum[i - 1];
}
}
cout << Max << endl;
}
return 0;
}
第四题
给你一个 数组 和一个 目标值。 可以对数组中的元素进行加或者减操作,代价就是差值。 现在要求操作后所有的数组元素乘机为目标值
问最小代价 n <= 1000
这道题我不会,考虑了唯一分解,但还是有很多情况, 求大佬说一下正解, 不过暴力骗分骗到了90%, 还有10%的应该是初始情况所有的乘积 < 目标值
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef pair<ll, ll> pll;
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
#define MAX_N 100010
int a[MAX_N];
int main() {
#ifdef DEBUG
freopen("data.txt", "r", stdin);
#endif // DEBUG
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, key;
cin >> n >> key;
for(int i = 0; i < n; i++)
cin >> a[i];
sort(a, a + n, [](int tmp_a, int tmp_b) {return tmp_a > tmp_b;});
int tmp_val = 1, flag = 0;
for(int i = 0; i < n; i++)
{
tmp_val *= a[i];
if(tmp_val > key)
{
flag = 1;
break;
}
}
if(flag)
{
int p = 1;
vector<int> val;
for(int i = 0; i < n; i++)
{
if(key % a[i] == 0)
{
key /= a[i];
p *= a[i];
}
else
{
val.push_back(a[i]);
}
}
if(key == 1)
{
int sum = 0;
for(int i = 0; i < val.size(); i++)
sum += val[i] - 1;
cout << sum << endl;
}
else
{
sort(val.begin(), val.end());
int pos = lower_bound(val.begin(), val.end(), key) - val.begin();
if(pos == 0)
{
int sum = abs(key - a[0]);
for(int i = 1; i < val.size(); i++)
sum += val[i] - 1;
cout << sum << endl;
}
else
{
if(abs(key - val[pos]) < abs(val[pos - 1]))
{
int sum = abs(key - val[pos]);
for(int i = 0; i < val.size(); i++)
{
if(i != pos)
sum += val[i] - 1;
}
cout << sum << endl;
}
else
{
int sum = abs(key - val[pos - 1]);
for(int i = 0; i < val.size(); i++)
{
if(i != pos - 1)
sum += val[i] - 1;
}
cout << sum << endl;
}
}
}
}
else
{
cout << rand() % 100 + 1 << endl;
}
return 0;
}

