9.4网易秋招笔试

栏中代码仅供参考!(栏主也是菜菜...)(B站ID:是潘哒不是panda,欢迎互粉~)

# 第一题

小红拿到了一个数组,她每次可以进行如下操作:

选一个数,使其加k。

小红可以进行任意次这样的操作。她想知道,最终数组最多有多少个数是相同的?

输入描述:

第一行输入两个正整数n和k,分别代表数组的长度、每次加的数值为k
第二行输入n个正整数ai,代表小红拿到的数组。
1<=n<=10e5
1<=k,ai<=10e9


输出描述:

最终相同数的数量最大值。


示例:

输入:
5 2
1 4 2 3 5
输出:
3
说明:
使第一个数操作2次,第四个数操作1次,数组变成[5,4,2,5,5],最终有3个数都是5.


解题代码(过):

int getSame(int num, int k, vector& nums)
{
    vector res(k, 0);
    for (int i = nums.size() - 1; i >= 0; i--)
    {
        nums[i] = nums[i] % k;
        res[nums[i]]++;
    }
    return *max_element(res.begin(), res.end());
}
int main() {
    int num ;
    int k;
    cin >> num >> k;

    vector nums(num,0);
    for (int i = 0; i < num; i++)
    {
        cin >> nums[i];
    }

    cout<


# 第二题

小红希望你构造一个长度为n的01串,其中恰好有k个1,且恰好有t对相邻字符都是1。你能帮帮她吗?

输入描述:

三个正整数n,k,t,用空格隔开
1<=n<=10e5
0<=k , t<=n

输出描述:

如果无法完成构造,请输出-1.否则输出任意一个满足条件01字符串

示例:

输入:
3 2 1
输出:
110
说明:
“110”为长度为3的01串,恰好有2个1,恰好有1对相邻数字是1,满足要求。


解题代码(过90%):

vector makeStr(int n, int k, int t)
{
    vector str(n,'0');
    int i = 0;
    for (; i < t + 1; i++)
    {
        str[i] = '1';
    }
    int  last = k - t - 1;
    while (last-- && i < n)
    {
        if (str[i - 1] == '0')
        {
            str[i] = '1';
            i++;
        }
        else
        {
            i++;
            last++;
        }
    }
    return str;
}
int main() {
    int n = 3;
    int k = 2;
    int t = 1;

    if (n == 0)return -1;
    if (t + 1 > n || k > n || t + 1 > k)return -1;
    vector str;
    str = makeStr(n,k,t);
    string res(str.begin(), str.end());
    cout << res;
    return 0;
}


# 第三题

题目描述:

小红拿到了一个数组,她每次可以进行如下操作:

选择一个数,使其减去x。

小红希望k次操作之后,该数组的最大值尽可能小。

输入描述:

第一行输入三个正整数 n,k,和x, 代表数组程度、操作次数以及每次操作减的数。
第二行输入n个正整数ai, 代表小红拿到的数组。

1<=n<=10e5
1<=ai , k,x<=10e9


输出描述:

一个整数,代表k次操作后,数组尽可能小的最大值。


示例:

输入:
5 3 5
4 3 11 2 1
输出:
3
说明:
第一个数操作1次,第三个数操作2次,数组变成[-1,3,1,2,1],最大值为3.


解题代码(超时):

int minMax(vector& a, int k, int x) {
        priority_queue q;
        for(auto i:a){
            q.push(i);
        }
        while(k--){
            int todo = q.top();
            q.pop();
            todo = todo - x;
            q.push(todo);
        }
        return q.top();
    }
};


# 第四题

小红拿到了一棵有根数,根节点为1号节点。已知i节点的权值为ai。小红定义每个节点为根的子树权值为该子树所有节点权值乘积的因子数量。小红想知道,所有子树权值之和是多少?

答案请对10e9 + 7取模(请注意是权值取模,而不是乘积取模后求因子数量!)

输入描述:

第一行输入一个正整数n,代表节点的数量。
第二行输入n个正整数ai,代表每个节点的权值。
接下来的n-1行,每行输入两个正整数u和v,代表点u和点v有一条边相连。
1<=n , ai<=10e5


输出描述:

所有子树的权值之和。


示例:

输入:
3
1 2 3
1 2
1 3
输出:
8
说明:
1为根的子树,所有节点乘积为6,因子数量是4.
2为根的子树,所有节点乘积为2,因子数量是2.
3为根的子树,所有节点乘积为3,因子数量是2.


解题代码(未测试):

const int N = 100010;
LL w[N];
LL ans = 0;
vector  T[N];
int getYZ(int a)
{
    int p = 0;
    for (int i = 1; i <= a; i++)
    {
        if (a % i == 0)
            p++;
    }
    return p;
}
void dfs(LL root, LL fa)
{
    for (int i = 0; i < T[root].size(); i++)
    {
        int child = T[root][i];
        if (child == fa)
            continue;
        else if (w[root] == 1)w[root]--;
        dfs(child, root);
        if (w[child] > 0)
            w[root] += w[child];
    }
    ans += w[root];
}
int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        int temp;
        cin >> temp;
        w[i] = getYZ(temp);
    }
    for (int i = 1; i < n; i++)
    {
        int a, b;
        cin >> a >> b;
        T[a].push_back(b);
        T[b].push_back(a);
    }
    dfs(1, -1);
    cout << ans << endl;

    return 0;
} 

作者:是潘哒不是panda https://www.bilibili.com/read/cv18442503 出处:bilibili

你可能感兴趣的:(秋招记录分享,算法,c++,面试)