蚂蚁0420开发笔试代码分享

T1水前缀后缀minmax

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

const int maxl=1e6+10;

int n;
int a[maxl];
int premx[maxl],sufmx[maxl];
int premi[maxl],sufmi[maxl];

inline int getmx(int i)
{
	int ret=a[i]+a[i+1];
	if(i+2<=n)
		ret=max(ret,sufmx[i+2]);
	if(i-1>=1)
		ret=max(ret,premx[i-1]);
	return ret;
}

inline int getmi(int i)
{
	int ret=a[i]+a[i+1];
	if(i+2<=n)
		ret=min(ret,sufmi[i+2]);
	if(i-1>=1)
		ret=min(ret,premi[i-1]);
	return ret;
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	premx[1]=premi[1]=a[1];
	for(int i=2;i<=n;i++)
		premx[i]=max(premx[i-1],a[i]),
		premi[i]=min(premi[i-1],a[i]);
	sufmx[n]=sufmi[n]=a[n];
	for(int i=n-1;i>=1;i--)
		sufmx[i]=max(sufmx[i+1],a[i]),
		sufmi[i]=min(sufmi[i+1],a[i]);
	int ans=2e9,mx,mi;
	for(int i=1;i<n;i++)
	{
		mx=getmx(i);
		mi=getmi(i);
		ans=min(ans,mx-mi);
	}
	printf("%d",ans);
	return 0;
}

T2打表代码

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

const int maxl=1e6+10;

int n;
int a[maxl],b[maxl],p[maxl];
int ans;
vector<vector<int> > ansa;
set<vector<int> >s;
inline int calc()
{
	int ret=0;
		for(int i=1;i<=n;i++)
		{
			int cnt2=1,cnt3=1;
			for(int j=i;j<=n;j++)
			{
				if(a[j]==2)
					cnt2++;
				else
					cnt3++;
				ret+=cnt2*cnt3;
			}
		}
	return ret;
}

int main()
{
	scanf("%d",&n);
	int cnt2,cnt3;
	scanf("%d %d",&cnt2,&cnt3);
	for(int i=1;i<=cnt2;i++)
		b[i]=2;
	for(int i=cnt2+1;i<=n;i++)
		b[i]=3;
	for(int i=1;i<=n;i++)
		p[i]=i;
	ans=2e9;
	do
	{
		for(int i=1;i<=n;i++)
			a[i]=b[p[i]];
		int tmp=calc();
		if(tmp<ans)
		{
			ansa.clear();s.clear();
			vector<int> d;
			for(int i=1;i<=n;i++)
				d.push_back(a[i]);
			ansa.push_back(d);
			ans=tmp;
			s.insert(d);
		}
		else if(tmp==ans)
		{
			vector<int> d;
			for(int i=1;i<=n;i++)
				d.push_back(a[i]);
			if(s.find(d)==s.end())
			{
				ansa.push_back(d);
				s.insert(d);
			}
		}
	}while(next_permutation(p+1,p+1+n));
	printf("%d\n",ans);
	for(auto &d:ansa)
	{
		for(auto &x:d)
			printf("%d ",x);
		puts("");
	}
	return 0;
}

T2AC 代码,但是并不是最小的

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

int n;ll ans=0;
int a[maxl],b[maxl],p[maxl];
ll sum2[maxl];
ll suml[maxl],sumr[maxl];
ll sum3[maxl];

int main()
{
	ll cnt2=0,cnt3=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		if(a[i]==2)
			cnt2++;
		else
			cnt3++;
	}
	
	//scanf("%lld %lld",&cnt2,&cnt3);

		for(int i=1;i<=cnt2;i++)
		{
			sum2[i]=sum2[i-1]+i+1;
			ans+=sum2[i];
		}	
		for(int i=1;i<=cnt3;i++)
		{
			sum3[i]=sum3[i-1]+i+1;
			ans+=sum3[i];
			ans+=(i+1)*sum2[cnt2];	
		}
	/*
	else
	{
		
		if(cnt2>cnt3)
			swap(cnt2,cnt3);
		int le=cnt2/2,ri=cnt2-le;
		for(int i=1;i<=le;i++)
		{
			suml[i]=suml[i-1]+i+1;
			ans+=suml[i];
		}
		for(int i=1;i<=cnt3;i++)
		{
			sum3[i]=sum3[i-1]+i+1;
			ans+=sum3[i];
			ans+=(i+1)*suml[le];	
		}
		for(int i=1;i<=ri;i++)
		{
			sumr[i]=sumr[i-1]+i+1;
			ans+=sumr[i];
			ans+=(i+1)*sum3[cnt3];
			ans+=(i+2+i+1+le)*le/2*(cnt3+1);
		}
		
	}
	*/
	cout << ans;
	return 0;
}

要写成22233333这样求才对,但实际不是这样最小啊,打表找出规律,cnt2=cnt3时,全2全3最小,假设cnt2<cnt3, {222}cnt2/2  {33333}cnt3 {222}cnt2/2。

9个数3个2, 6个3,最小应该是2 2 3 3 3 3 3 3 2,这样答案是324,而直接2 2 2 3 3 3 3 3是336,上面注释代码是当cnt2<cnt3是的正解代码,标程数据是错的

T3简单数位DP,好像直接顺着DP也行?但是数位dp的dfs写法很无脑

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

int n;
char s[maxl];
int dp[maxl][2];
int ans[maxl][2];

inline void add(int &a,int b)
{
	a+=b;
	if(a>=mod) a-=mod;
}

inline int dfs(int k,int f1)
{
	if(k>n)
		return 1;
	int &x=dp[k][f1];
	if(x>0)
		return x;
	if(!f1 || s[k]=='B') //a[k]='B'
		add(x,dfs(k+1,f1 && s[k]=='B'));
	add(x,dfs(k+1,f1 && s[k]=='R'));
	return x;	
}

inline int calc(int k,int f1)
{
	if(k>n)
		return 0;
	int &x=ans[k][f1];
	if(x>0)
		return x;
	if(!f1 || s[k]=='B') //a[k]='B'
		add(x,calc(k+1,f1 && s[k]=='B'));
	add(x,calc(k+1,f1 && s[k]=='R'));
	add(x,dfs(k+1,f1 && s[k]=='R'));
	return x;	
}

int main()
{
	scanf("%d",&n);
	scanf("%s",s+1);
	dfs(1,1);
	calc(1,1);
	printf("%d",ans[1][1]);
	return 0;
}

#蚂蚁##蚂蚁笔试##蚂蚁2024暑期实习#
全部评论
%您,我投算法 笔试ak也挂了
点赞 回复 分享
发布于 2023-04-26 11:04 辽宁
大佬求解释第三题的思路
点赞 回复 分享
发布于 2023-04-24 19:36 上海

相关推荐

刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结:&nbsp;27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
字节7000实习来了,你...
点赞 评论 收藏
分享
评论
1
8
分享

创作者周榜

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