8.12美团秋招第一场笔试ak攻略
T1
哈希表记录每个元素对应的位置 最后比较abs(pos[x]-pos[y])==1即可
void solve(int u){
cin>>n;
unordered_map<int,int>pos;
for(int i=1;i<=n;i++){
int x;
cin>>x;
pos[x]=i;
}
int x,y;
cin>>x>>y;
if(abs(pos[x]-pos[y])==1)puts("Yes");
else puts("No");
}
T2
把原数组复制一份 即可破环成链 然后使用前缀和计算距离即可(注意分类讨论)
void solve(int u){
cin>>n;
for(int i=1;i<=n;i++){
cin>>w[i];
w[i+n]=w[i];
}
for(int i=1;i<=n*2;i++){
sum[i]=sum[i-1]+w[i];
}
int x,y;
cin>>x>>y;
x--;y--;
if(x>y)swap(x,y);
ll res=min(sum[y]-sum[x],sum[x+n]-sum[y]);
cout<<res<<endl;
}
T3
二维前缀和模板题:注意只能枚举(i,m)和(n,j)的位置的终点
void solve(int u) {
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>s[i][j];
s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
}
}
ll sum=s[n][m],res=1e18;
for(int i=1;i<=n;i++){ //枚举切割(i,m)
ll a=s[i][m],b=sum-a;
res=min(res,abs(a-b));
}
for(int i=1;i<=m;i++){ //枚举切割(n,i)
ll a=s[n][i],b=sum-a;
res=min(res,abs(a-b));
}
cout<<res<<endl;
}
T4
枚举+DFS求连通块距离
二维坐标映射到一维小技巧:n*m 二维坐标为(i,j)则一维坐标为i*m+j
记得每次开标记数组都需要重新初始化为false
void dfs(int x,int y,vector<vector<bool>>&st){ //dfs将某一个连通块全部标记
int t=x*m+y;
st[x][y]=true;
for(int i=0;i<4;i++){
int a=x+dx[i],b=y+dy[i],z=a*m+b;
if(a<0||a>=n||b<0||b>=m||st[a][b]||s[z]!=s[t])continue;
dfs(a,b,st);
}
}
int f(){ //求连通块个数
vector<vector<bool>>st(n,vector<bool>(m,false));
int cnt=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(!st[i][j]){
cnt++;
dfs(i,j,st);
}
}
}
return cnt;
}
void solve(int u) {
cin>>k;
cin>>s;
int res=k;
for(int i=1;i<=k;i++){
if(k%i){ //必须要可以整除
continue;
}
n=i;m=k/i;
res=min(res,f());
}
cout<<res<<endl;
}
T5
树形dp+数论(数据好像超级弱,应该没有1e9)
check(a,b)乘积是否为完全平方数可以使用质因数分解法:看二者的质因数分解的和的每个质因数的个数是否都是偶数(复杂度logU) U<=1e9
考虑对u节点染色:(u节点和他的子节点x都会被染色)
设f[u][0]表示以u为根节点且u没被染色的最多红色节点个数
f[u][1]表示以u为根节点且u被染色的最多红色节点个数
显然f[u][0]+=max(f[x][1],f[x][0])
对于f[u][1] 只能选择某一个子节点染色 假设选择的子节点为x
f[u][1]=f[u][0]-max(f[x][0],f[x][1])+f[x][0]+2
因此可以遍历子节点 取max即可
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int>PII;
#define x first
#define y second
typedef long long ll;
const int N=2E5+10,mod=1e9+7;
int T,w[N],n,res;
unordered_set<ll>st;
bool is_st[N];
vector<int>g[N];
int f[N][2];
bool check(int a,int b){
ll c=sqrt(1ll*a*b);
return c*c==1ll*a*b;
}
void dfs(int u,int fa){
if(g[u].size()==1&&g[u][0]==fa)return;
for(int &x:g[u]){
if(x==fa)continue;
dfs(x,u);
f[u][0]+=max(f[x][0],f[x][1]);
}
for(int &x:g[u]){
if(x==fa)continue;
int a=w[u],b=w[x];
if(check(a,b)){
f[u][1]=max(f[u][1],f[u][0]-max(f[x][0],f[x][1])+2+f[x][0]);
}
}
}
void solve(int u){
cin>>n;
for(int i=1;i<=n;i++)cin>>w[i];
for(int i=1;i<n;i++){
int a,b;
cin>>a>>b;
g[a].push_back(b);
g[b].push_back(a);
}
dfs(1,0);
cout<<max(f[1][0],f[1][1])<<endl;
}
int main(){
T=1;
for(int i=1;i<=T;i++){
solve(i);
}
return 0;
}
#你的秋招第一场笔试是哪家##美团笔试##后端开发##互联网大厂秋招#互联网笔试真题题解 文章被收录于专栏
收录近两年互联网公司笔试真题解析,并提供Java,Python,C++三种语言版本的代码
深信服公司福利 804人发布
