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;
}
#网易##笔试题目#