0812美团笔试题解及代码分享

T1

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int maxl=1e6+10;

int n,m,tot,ans;
int a[maxl];
char s[maxl];

inline void prework()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int x;cin>>x;
		a[x]=i;
	}
	int x,y;cin>>x>>y;
	if(abs(a[x]-a[y])==1)
		puts("Yes");
	else
		puts("No");
}

inline void mainwork()
{
	
}

inline void print()
{
	
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	prework();
	mainwork();
	print();
	return 0;	
}

T2

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int maxl=1e6+10;

int n,m,tot;ll ans;
ll a[maxl],sum[maxl];
char s[maxl];

inline void prework()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i],sum[i]=sum[i-1]+a[i];
		a[i+n]=a[i];
	}
	for(int i=n+1;i<=2*n;i++)
		sum[i]=sum[i-1]+a[i];
	int x,y;
	cin>>x>>y;
	if(x>y)
		swap(x,y);
	ll ans=min(sum[y-1]-sum[x-1],sum[x+n-1]-sum[y-1]);
	cout<<ans;
}

inline void mainwork()
{
	
}

inline void print()
{
	
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	prework();
	mainwork();
	print();
	return 0;	
}

T3

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int maxl=1e3+10;

int n,m,tot;ll ans;
int a[maxl][maxl];
ll row[maxl],col[maxl];
char s[maxl];

inline void prework()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j];
			row[i]+=a[i][j];
			col[j]+=a[i][j];
		}
}

inline void mainwork()
{
	ll you=0,xia=0,zuo=0,shang=0;
	for(int j=1;j<=m;j++)
		you+=col[j];
	ans=you;xia=you;
	for(int j=1;j<m;j++)
	{
		you-=col[j];
		zuo+=col[j];
		ans=min(ans,abs(you-zuo));
	}
	for(int i=1;i<n;i++)
	{
		shang+=row[i];
		xia-=row[i];
		ans=min(ans,abs(shang-xia));
	}
}

inline void print()
{
	cout<<ans;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	prework();
	mainwork();
	print();
	return 0;	
}

T4 因为一定要整除,所以枚举所有因数就行了,然后构造完以后bfs或者dfs搞flood fill求连通块个数,O(nsqrt(n))

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int maxl=1e6+10;

int n,m,tot,ans;
int a[maxl];
string s;
int tx[4]={0,1,0,-1};
int ty[4]={1,0,-1,0};

inline void prework()
{
	cin>>n;
	cin>>s;
}

inline void solv(int c)
{
	vector<string> b;int nowid=0;
	int r=n/c;
	for(int i=1;i<=r;i++)
	{
		b.emplace_back(s.substr(nowid,c));
		nowid+=c;
	}
	vector<vector<int>> vis(r,vector<int>(c,0));
	
	auto bfs=[&](int ix,int iy) ->void
	{
		using pii=pair<int,int>;
		queue<pii> q;
		q.push({ix,iy});vis[ix][iy]=true;
		char ch=b[ix][iy];
		while(q.size())
		{
			pii d=q.front();q.pop();
			for(int k=0;k<4;k++)
			{
				int x=d.first+tx[k],y=d.second+ty[k];
				if(x<0 || x>=r || y<0 || y>=c || 
					vis[x][y] || ch!=b[x][y])
						continue;
				vis[x][y]=1;
				q.push({x,y});
			}
		}
	};
	int cnt=0;
	for(int i=0;i<r;i++)
		for(int j=0;j<c;j++)
		if(!vis[i][j])
		{
			cnt++;
			bfs(i,j);
		}
	ans=min(ans,cnt);
}

inline void mainwork()
{
	ans=n;int up=sqrt(n);
	for(int i=1;i<=up;i++)
	if(n%i==0)
		solv(i),solv(n/i);
}

inline void print()
{
	cout<<ans;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	prework();
	mainwork();
	print();
	return 0;	
}

T5 设dp[u][1]表示u为染红点,某个子节点也染红,u子树最多的染色点个数,dp[u][0]则表示u不染色的子树最多个数。可以注意到dp[u][1]如果选择把a[u]和a[v]染红,那么转移的时候v只能选择dp[v][0],因为要求v之前不被染色

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int maxl=1e6+10;

int n,m,tot,ans;
ll a[maxl];
int dp[maxl][2];
char s[maxl];
vector<int> e[maxl];

inline void prework()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<n;i++)
	{
		int u,v;cin>>u>>v;
		e[u].emplace_back(v);
		e[v].emplace_back(u);
	}
}

inline bool x2(ll x,ll y)
{
	ll d=sqrt(x*y);
	return d*d==x*y;
}

inline void dfs(int u,int fa)
{
	for(int &v:e[u])
	{
		if(v==fa) continue;
		dfs(v,u);
		dp[u][0]+=max(dp[v][1],dp[v][0]);
	}
	for(int &v:e[u])
	{
		if(v==fa || !x2(a[u],a[v])) continue;
		dp[u][1]=max(dp[u][1],dp[u][0]-max(dp[v][0],dp[v][1])+2+dp[v][0]);
	}
}

inline void mainwork()
{
	dfs(1,0);
	ans=max(dp[1][0],dp[1][1]);
}

inline void print()
{
	cout<<ans;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	prework();
	mainwork();
	print();
	return 0;	
}

#秋招##笔试##美团##美团笔试##美团秋招#
全部评论
这写法,一看就是ACM大佬呀
点赞 回复 分享
发布于 2023-08-12 12:06 陕西
Acm大佬,太强了
点赞 回复 分享
发布于 2023-08-12 12:08 上海
大佬,厉害
点赞 回复 分享
发布于 2023-08-12 12:09 陕西
大佬,dp[u][0]-max(dp[v][0],dp[v][1])+2+dp[v][0] 这里的-max(dp[v][0],dp[v][1])咋理解?
点赞 回复 分享
发布于 2023-08-12 12:27 浙江
大佬
点赞 回复 分享
发布于 2023-08-12 13:12 天津
牛逼,大佬真的牛逼
点赞 回复 分享
发布于 2023-08-12 13:52 湖北

相关推荐

头像
11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
牛客618272644号:佬携程工作怎么样,强度大吗
点赞 评论 收藏
分享
11 47 评论
分享
牛客网
牛客企业服务