网易互娱 开发11号3道笔试题题解

1. 大刀
求所有点到(X,Y)的距离,排序,然后遍历,判定是否可达有无补品,增加刀长

#include <bits/stdc++.h>

//freopen("temp.in","r",stdin);#include "utils.cpp"
using namespace std;
#define UF(i,start,end) for(auto i=start;i<end;i++)
#define DF(i,start,end) for(auto i=start;i>=end;i--)
int ri(){int a;scanf("%d",&a);return a;}//读取整数并返回
string rs(){string s;cin>>s;return s;}
typedef long long ll;
typedef vector<int> veci;
typedef vector<ll> vecll;
typedef vector<bool> vecb;
typedef vector<string> vecs;
typedef vector<vector<int>> vveci;


template<typename T> ostream& operator<<(ostream& os,const vector<T>& v){
for(auto t:v)
os<<t<<" ";
os<<endl;
return os;
}
template <typename T>
ostream &print(ostream &os,const T &t){
return os<<t<<endl;
}
template <typename T,typename... Args>
ostream &print(ostream &os,const T &t,const Args&... rest){
os << t <<" ";
return print(os,rest...);
}
template <typename T,typename... Args>
void PR(const T &t,const Args&... rest){
print(cout,t,rest...);
}


struct Pos{
int x,y;
int d2;//d^2
Pos(int x_,int y_,int d2_):x(x_),y(y_),d2(d2_){}
friend bool operator< (Pos p1,Pos p2){
return p1.d2<p2.d2;
}
};
int X,Y;
int dis(int i,int j){
return pow(X-i,2)+pow(Y-j,2);
}
int main(){
//PR(get_next("ababc"));
freopen("temp.in","r",stdin);
//freopen("temp.out", "w", stdout);
//test();
string s1,s2;
int T;
int M,L;

cin>>T;
while(T--){
cin>>M>>L;
vveci V(M,veci(M,0));
UF(i,0,M){
UF(j,0,M){
cin>>V[i][j];
}
}
cin>>X>>Y;//第i行
//从靠近X,Y的
veci Q(M*M,0);//将(X,Y)能抵达的区域按距离排序
vector<Pos> V2;
UF(i,0,M){
UF(j,0,M){
V2.push_back(Pos(i,j,dis(i,j)));
}
}
sort(V2.begin(),V2.end());//从低到高排序
UF(i,0,M*M){
if(V2[i].d2<=pow(L,2)){
L+=V[V2[i].x][V2[i].y];
}
}
PR(L);
}

//cout<<setprecision(2)<<ans<<endl;       设置输出总位数
//cout<<fixed<<setprecision(2)<<ans<<endl;       设置小数点后两位输出
return 0;

}

2.并查集  集合操作
将X独立出来时,如果X是集合的祖先,需要从集合中再选一个当祖先
#include <bits/stdc++.h>

//freopen("temp.in","r",stdin);#include "utils.cpp"
using namespace std;
#define UF(i,start,end) for(auto i=start;i<end;i++)
#define DF(i,start,end) for(auto i=start;i>=end;i--)
int ri(){int a;scanf("%d",&a);return a;}//读取整数并返回
string rs(){string s;cin>>s;return s;}
typedef long long ll;
typedef vector<int> veci;
typedef vector<ll> vecll;
typedef vector<bool> vecb;
typedef vector<string> vecs;
typedef vector<vector<int>> vveci;


template<typename T> ostream& operator<<(ostream& os,const vector<T>& v){
for(auto t:v)
os<<t<<" ";
os<<endl;
return os;
}
template <typename T>
ostream &print(ostream &os,const T &t){
return os<<t<<endl;
}
template <typename T,typename... Args>
ostream &print(ostream &os,const T &t,const Args&... rest){
os << t <<" ";
return print(os,rest...);
}
template <typename T,typename... Args>
void PR(const T &t,const Args&... rest){
print(cout,t,rest...);
}


//并查集
const int MAX_SIZE = 10005;
int f[MAX_SIZE];//祖先节点
int find_root(int v){
if(f[v]==v) return v;
int z = find_root(f[v]);//找父亲的祖先
f[v] = z;
return z;
}
int N,M;
void my_print(){
UF(i,1,N+1){
cout<<f[i]<<" ";
}
cout<<endl;
}
int main(){
//PR(get_next("ababc"));
freopen("temp.in","r",stdin);
//freopen("temp.out", "w", stdout);
//test();
string s1,s2;
int T;

int X,Y;
cin>>T;
while(T--){
memset(f,-1,sizeof f);//能初始化成功吗?

cin>>N>>M;
int OP;
UF(i,1,N+1) f[i]=i;
UF(i,0,M){
cin>>OP;
if(OP==1){
cin>>X>>Y;
int a = find_root(X),b = find_root(Y);
if(a!=b){
f[b] = a;//令Y的祖先  认X的祖先为  祖先
}
//my_print();
}else{
cin>>X;
if(OP==2){
//如果X是祖先,就让它的子孙重新认一个
int new_z=-1;
UF(i,1,N+1){
if(i!=X and find_root(i)==X){
new_z = i;
}
}
UF(i,1,N+1){
if(i!=X and find_root(i)==X) f[i]=new_z;
}
f[X]=X;
//my_print();
}else{
int ans = 0;
X = find_root(X);
UF(i,1,N+1){
if(find_root(i)==X) ans++;
}
PR(ans);
}
}
}

}

//cout<<setprecision(2)<<ans<<endl;       设置输出总位数
//cout<<fixed<<setprecision(2)<<ans<<endl;       设置小数点后两位输出
return 0;

}

3.  最小错序排列.. 搜索--剪枝
#include <bits/stdc++.h>

//freopen("temp.in","r",stdin);#include "utils.cpp"
using namespace std;
#define UF(i,start,end) for(auto i=start;i<end;i++)
#define DF(i,start,end) for(auto i=start;i>=end;i--)
int ri(){int a;scanf("%d",&a);return a;}//读取整数并返回
string rs(){string s;cin>>s;return s;}
typedef long long ll;
typedef vector<int> veci;
typedef vector<ll> vecll;
typedef vector<bool> vecb;
typedef vector<string> vecs;
typedef vector<vector<int>> vveci;


template<typename T> ostream& operator<<(ostream& os,const vector<T>& v){
for(auto t:v)
os<<t<<" ";
os<<endl;
return os;
}
template <typename T>
ostream &print(ostream &os,const T &t){
return os<<t<<endl;
}
template <typename T,typename... Args>
ostream &print(ostream &os,const T &t,const Args&... rest){
os << t <<" ";
return print(os,rest...);
}
template <typename T,typename... Args>
void PR(const T &t,const Args&... rest){
print(cout,t,rest...);
}

const int MAX_SIZE = 105;

veci A(MAX_SIZE),V(MAX_SIZE);
vecb visited(MAX_SIZE);

veci M(MAX_SIZE);//M[i]表示[i,n) 剩余最小权值和
int n;
int ans;

//搜索--剪枝
void f(int k,int val){
if(k==n){
if(val<ans){
ans=val;
}
return ;
}
if(val+M[k]>=ans) return ;//这里是重点,如果当前错序值  +   后面元素的最小错序权值>=目前最优解  返回
UF(i,0,n){
if(visited[i]) continue;
if(i==k) continue;
visited[i]=true;
f(k+1,val+V[A[k]-1]*abs(k-i));
visited[i]=false;
}
}


int main(){
//freopen("temp.in","r",stdin);

int T;
cin>>T;
while(T--){
cin>>n;
A.assign(n,0),V.assign(n,0),M.assign(n,0);
visited.assign(n,false);

UF(i,0,n) cin>>A[i];
UF(i,0,n) cin>>V[i];

M[n-1] = V[A[n-1]-1];
DF(i,n-2,0){
M[i]=M[i+1]+V[A[i]-1];//[i,n)元素的最小权值和(假设那些元素都乱序1位)
}

ans = INT_MAX;
f(0,0);
PR(ans);
}

//cout<<setprecision(2)<<ans<<endl;       设置输出总位数
//cout<<fixed<<setprecision(2)<<ans<<endl;       设置小数点后两位输出
return 0;

}



#网易互娱2020春招笔试#
全部评论
错排的是不是有规律啊,偶数就权重累加,奇数就权重累加再加一个最小值
1 回复 分享
发布于 2020-04-11 22:29
我太菜了,第三题没有想到这个对距离剪枝的方法,只知道傻傻地把错位数剪出来😅
点赞 回复 分享
发布于 2020-04-11 21:30

相关推荐

自从我室友在计算机导论课上听说了“刷&nbsp;LeetCode&nbsp;是进入大厂的敲门砖”,整个人就跟走火入魔了一样。他在宿舍门口贴了一张A4纸,上面写着:“正在&nbsp;DP,请勿打扰,否则&nbsp;Time&nbsp;Limit&nbsp;Exceeded。”日记本的扉页被他用黑色水笔加粗描了三遍:“Talk&nbsp;is&nbsp;cheap.&nbsp;Show&nbsp;me&nbsp;the&nbsp;code。”连宿舍聚餐,他都要给我们讲解:“今天的座位安排可以用回溯算法解决,但为了避免栈溢出,我建议用动态规划。来,这是状态转移方程:dp[i][j]&nbsp;代表第&nbsp;i&nbsp;个人坐在第&nbsp;j&nbsp;个位置的最优解。”我让他去楼下取个快递,他不直接去,非要在门口踱步,嘴里念念有词:“这是一个图的遍历问题。从宿舍楼(root)到驿站(target&nbsp;node),我应该用&nbsp;BFS&nbsp;还是&nbsp;DFS?嗯,求最短路径,还是广度优先好。”和同学约好出去开黑,他会提前发消息:“集合点&nbsp;(x,&nbsp;y),我们俩的路径有&nbsp;k&nbsp;个交点,为了最小化时间复杂度,应该在&nbsp;(x/2,&nbsp;y/2)&nbsp;处汇合。”有一次另一个室友低血糖犯了,让他帮忙找颗糖,他居然冷静地分析道:“别急,这是一个查找问题。零食箱是无序数组,暴力查找是&nbsp;O(n)。如果按甜度排序,我就可以用二分查找,时间复杂度降到&nbsp;O(log&nbsp;n)。”他做卫生也要讲究算法效率:“拖地是典型的岛屿问题,要先把连通的污渍区块都清理掉。倒垃圾可以用双指针法,一个指针从左往右,一个从右往左,能最快匹配垃圾分类。”现在我们宿舍的画风已经完全变了,大家不聊游戏和妹子,对话都是这样的:“你&nbsp;Two&nbsp;Sum&nbsp;刷了几遍了?”“别提了,昨天遇到一道&nbsp;Hard&nbsp;题,我连暴力解都想不出来,最后只能看题解。你呢?”“我动态规划还不行,总是找不到最优子结构。今天那道接雨水给我整麻了。”……LeetCode&nbsp;真的害了我室友!!!
老六f:编程嘉豪来了
AI时代还有必要刷lee...
点赞 评论 收藏
分享
找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
评论
1
8
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务