牛客春招刷题训练营 - 2025.5.12 题解

活动地址:牛客春招刷题训练营 - 编程打卡活动

Easy 小红的魔法药剂

简要题意

种药剂,可以花费 元买一支红色的第 种药剂。每种蓝色药剂可以由某其它两种的红色药剂配成,求得到 种药剂(红蓝皆可)至少需要多少钱。

Solution

每种药剂价格相当于自身红色药剂价格与两种用于合成它的红色药剂价格的最小值,求和即为答案。

Code

void R()
{
	int n,ans=0;
	cin>>n;
	vector<int> a(n);
	for (int &x:a) cin>>x;
	for (int i=0;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		x--,y--;
		ans+=min(a[i],a[x]+a[y]);
	}
	cout<<ans;
	return;
}

Medium 游游的字母翻倍

简要题意

给一个字符串与若干次操作。每次操作会选定一个区间,在区间内字符串的每个字母之后插入一个与其相同的字母,求最终串。

Solution

操作次数很少,暴力 insert() 即可。

Code

void R()
{
	int n,q;
	string s;
	cin>>n>>q>>s;
	while (q--)
	{
		int l,r;
		cin>>l>>r;
		l--,r--;
		for (int i=r;i>=l;i--)
			s.insert(i,1,s[i]);
	}
	cout<<s;
	return;
}

Hard 游游的数值距离

简要题意

找一对不含 的正整数 ,使 最小。

Solution

因为阶乘增长快,我们枚举

固定 之后,可以发现题式是关于 的凸函数,我们直接试取 ,特判一下等于 的情况即可。

Code

void R()
{
	i64 fac[14]={1};
	for (int i=1;i<14;i++)
		fac[i]=fac[i-1]*i;
	i64 n,ans1=1,ans2=1;
	cin>>n;

	for (i64 x=3;x<14;x++)
	{
		i64 t1=floorDiv(n,fac[x]-1),t2=ceilDiv(n,fac[x]-1);
		if (t1==2) t1--;
		if (t2==2) t2++;
		if (abs((fac[x]-1)*t1-n)<abs((fac[ans1]-1)*ans2-n))
			ans1=x,ans2=t1;
		if (abs((fac[x]-1)*t2-n)<abs((fac[ans1]-1)*ans2-n))
			ans1=x,ans2=t2;
	}
	cout<<ans1<<' '<<ans2;
	return;
}
#牛客春招刷题训练营#
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务