蚂蚁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 上海

相关推荐

避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-30 18:19
点赞 评论 收藏
分享
评论
1
8
分享

创作者周榜

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