首页 > 8-8日网易笔试(1-3-4)题解
头像
浮沙上的高台
编辑于 2020-08-08 20:14
+ 关注

8-8日网易笔试(1-3-4)题解

第一道

所有大于3的数都能被分解成若干个2和一个3的和,比如:
4 = 2 + 2, 素数个数= 4 / 2 = 2
5=2 + 3, 素数个数= 5 / 2 = 2, 取下整
6=2 + 2 + 2, 素数个数= 6 / 2 = 2
7=2 + 2 + 3, 素数个数= 7 / 2 = 3,取下整
所以对于数num, 其素数个数 = num/ 2, 取下整

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;

void solver(vector<long>& nums, int n)
{

    long  ans = 0;
    for(int i = 0; i < n; i++)
    {
        if(nums[i] == 1)
            continue;
        else
            ans += floor(nums[i] / 2);

    }
    cout<<ans<<endl;
}

int main()
{
    int n;
    cin>>n;
    vector<long> nums(n);
    for(int i = 0; i< n;i++)
        cin>>nums[i];
    solver(nums, n);
    return 0;
}

第三道 平分物品

0、遍历一次数组,计算所有物品的总价值sum,丢弃的物品价值初始化为res = sum;
1、初始化两个桶,每个桶表示一个同学分的的价值之和
2、将数组从小到大排序,从最后一个元素开始,放入第一个桶或第2个桶
3、每次迭代检查两个桶的物品价值是否相等,如果相等,则丢弃的物品价值res=min(res,sum-bucket[0]*2)

#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>

using namespace std;
void push(int i, vector<int>& bucket, vector<int> & V, int& res, int& sum)
{
    if(bucket[0] == bucket[1])
        res = min(res, sum - bucket[0] * 2);
    if(i < 0)
        return ;//bucket[0] == bucket[1];
    for(int j = 0; j < 2; j++)
    {
        if(bucket[j] + V[i] > ceil(sum / 2)) //放入第j个桶前判断是否大于sum/2,大于则剪枝
            continue;
        bucket[j] += V[i]; //放第j个桶
        push(i-1, bucket, V, res, sum);
        bucket[j] -= V[i]; // 回溯
    }
}

void solver(vector<int>& V, int n)
{
    if(n == 1)
    {
        cout<<V[0]<<endl;
        return;
    }
    sort(V.begin(), V.end()); //从小到大排序
    vector<int> bucket(2, 0); //  初始化两个桶
    int sum = 0;
    for(int i = 0; i < n;i++) //对数组求和
        sum += V[i];
    int res = sum; //丢弃的物品价值
    for(int i = n-1; i >= 0; i--)
    {
        push(i, bucket, V, res, sum);
    }

    cout<<res<<endl;
}

int main()
{

    int T;
    cin>>T;
    for(int i = 0; i< T;i++)
    {
        int n;
        cin>>n;
        vector<int> V(n);
        for(int j = 0; j< n;j++)
            cin>>V[j];
        solver(V, n);
    }
    return 0;
}

第四题 学术认可

1、根据输入建立一个有向图
2、教授i和教授j相互认可==> (从教授i开始经过深度优先遍历能访问到教授j) && (从教授j开始经过深度优先遍历能访问到教授i)

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;

bool dfs(int a, int b, vector<vector<int> > & mat, vector<int>& visit)
{
    /*
    深度优先遍历判断是否能从节点i走到节点j

    */
    if(mat[a][b] == 1)
        return true;
    visit[a] = 1; //记录已访问过的节点
    for(int i = 0; i < mat.size(); i++)
    {
        if(i != a && visit[i] == 0 && mat[a][i] == 1)
        {
            if(dfs(i, b, mat, visit))
                return true;

        }
    }
    return false;
}
void solver(vector<vector<int> > & egde, int n, int m)
{

    //邻接矩阵存储有向图
    vector<vector<int> > mat(n, vector<int>(n, 0));
    for(int i = 0; i< m;i++)
    {
        int x = egde[i][0]-1;
        int y = egde[i][1]-1;
        mat[x][y] = 1;
    }
    int ans = 0;
    for(int i = 0; i < n;i++)
    {
        for(int j = i+1; j < n;j++)
        {
            vector<int> visit1(n, 0);
            vector<int> visit2(n, 0);
            if(dfs(i, j, mat, visit1) && dfs(j, i, mat, visit2))
                ans += 1;
        }
    }
    cout<<ans<<endl;
    return;

}

int main()
{

    int n, m;
    cin>>n>>m;
    vector<vector<int> >  egde(m, vector<int>(2));
    for(int i = 0; i< m;i++)
    {
        for(int j = 0; j<2;j++)
            cin>>egde[i][j];
    }
    solver(egde, n, m);

    return 0;
}

全部评论

(1) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐