20230806米哈游笔试题解及代码分享

T1

#include<bits/stdc++.h>
using namespace std;
using ll=long long;

const int maxl=1e6+10;

int n,m,ans;

inline void prework()
{
	cin>>n;
	vector<string> a(n);
	vector<string> b(n);
	for(int i=0;i<n;i++)
		cin>>a[i];
	for(int i=0;i<n;i++)
		cin>>b[i];
	int num=0;
	for(int i=0;i<n;i++)
	{
		if(a[i]==b[i]) num++;
		else num--;
		if(num<0)
			return;
	}
	ans++;
}

inline void mainwork()
{
	
}

inline void print()
{
	
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int t=1;
	cin>>t;
	for(int i=1;i<=t;i++)
	{
		prework();
		mainwork();
		print();
	}
	cout<<ans;
	return 0;
}

T2

从小开始打到半血,能使得后面获得更多的转圈圈,最后再把转圈圈全打完还不够需要继续普攻的加上

但是这样是错的,但是只有这种错解能过

5

1 2 3 3 10 ,这个输出6,但实际上攻击10 五次就打完了

#include<bits/stdc++.h>
using namespace std;
using ll=long long;

const int maxl=1e6+10;

int n,m;ll ans=0;
int a[maxl],b[maxl];

inline void prework()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	sort(a+1,a+1+n);
	int now=0;
	for(int i=1;i<=n;i++)
	{
		int d=a[i]-(a[i]/2);
		if(now<d)
		{	
			ans+=d-now;
			b[i]=d-now;
		}
		now++;
	}
	for(int i=1;i<=n;i++)
	if(now+b[i]<a[i])
		ans+=a[i]-(now+b[i]);
	cout<<ans;
}

inline void mainwork()
{
	
}

inline void print()
{
	
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int t=1;
//	cin>>t;
	for(int i=1;i<=t;i++)
	{
		prework();
		mainwork();
		print();
	}
	return 0;
}

T3

把一个子树i挪到1节点,其实就是这棵子树所有点的深度减掉dep[i]-2,就可以直接算了

#include<bits/stdc++.h>
using namespace std;
using ll=long long;

const int maxl=1e6+10;

int n,m;ll ans;
ll a[maxl],dep[maxl],suma[maxl],dp[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 void dfs(int u,int fa)
{
	dp[u]=a[u];
	suma[u]=a[u];
	for(int v:e[u])
	{
		if(v==fa) continue;
		dep[v]=dep[u]+1;
		dfs(v,u);
		suma[u]+=suma[v];
		dp[u]+=dp[v]+suma[v];
	}
}

inline void mainwork()
{
	dep[1]=1;
	dfs(1,0);
	ans=dp[1];
	for(int i=2;i<=n;i++)
	{
		ans=min(ans,dp[1]-(dep[i]-2)*suma[i]);
	}
}

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

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int t=1;
//	cin>>t;
	for(int i=1;i<=t;i++)
	{
		prework();
		mainwork();
		print();
	}
	return 0;
}

#笔试##米哈游##米哈游秋招##秋招笔试##秋招#
全部评论
这么强么 佬
1 回复 分享
发布于 2023-08-06 22:03 陕西
全100%了吗,太强了吧
1 回复 分享
发布于 2023-08-06 22:08 安徽
为什么是-2,我-1全错
1 回复 分享
发布于 2023-08-06 22:23 广东
t3一个思路,每个节点维护一个当前子树的不完美值和所有节点的数值和,最后就是遍历每个非跟节点,减掉dep-2的该子树所有节点和。然后只过了5%
点赞 回复 分享
发布于 2023-08-06 22:08 浙江
多个相同数同时到达半血以下时,是转一圈还是多圈啊
点赞 回复 分享
发布于 2023-08-06 22:18 浙江
笑死,怎么还有错题
点赞 回复 分享
发布于 2023-08-06 22:18 江苏
太强了佬
点赞 回复 分享
发布于 2023-08-06 22:44 上海
t2用正解写是得多少分啊,我最后交完正解直接走人了,没想到还有这出
点赞 回复 分享
发布于 2023-08-07 08:36 江苏
请问t2哪里为什么是b[i]=d-now; 我理解的b[i]是代表刚好砍到一半或者一般以上时候剩下来。那么剩余的感觉应该是a[i] - (a[i]-(a[i]/2)) = a[i]/2。求佬答疑解惑。
点赞 回复 分享
发布于 2023-08-12 16:23 上海

相关推荐

8 14 评论
分享
牛客网
牛客企业服务