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

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

Easy 一封奇怪的信

简要题意

钦定每个小写字母一个权值。给定一个小写字母串,求将其分行书写,保证每行权值和不超过 的条件下,最小书写行数以及此时末行最短长度。

Solution

直接模拟即可。

Code

void R()
{
	vector<int> w(26);
	string s;
	for (int &x:w) cin>>x;
	cin>>s;

	int now=0,cnt=1;
	for (char c:s)
	{
		int p=c-'a';
		if (now+w[p]>100)
			cnt++,now=w[p];
		else now+=w[p];
	}
	cout<<cnt<<' '<<now<<'\n';
	return;
}

Medium 小球投盒

简要题意

个空盒与 次操作,每次操作为下列二者之一:

  • 选一个盒放入一球

  • 选一个盒,对其余所有盒各放入一球

求最早在第几次操作后每盒内都有球。

Solution

set 维护空盒。

第一个操作就是删去某盒。

第二个操作就是只留下某盒,如果该盒已被删去就结束。

Code

void R()
{
	int n,m,ans=-1;
	cin>>n>>m;
	set<int> s;
	for (int i=1;i<=n;i++)
		s.insert(i);
	for (int i=1;i<=m;i++)
	{
		int t,x;
		cin>>t>>x;
		if (t==1) s.erase(x);
		else
		{
			if (s.count(x))
			{
				s.clear();
				s.insert(x);
			}
			else s.clear();
		}
		if (ans==-1&&s.empty())
			ans=i;
	}
	cout<<ans;
	return;
}

Hard 请客吃饭

简要题意

给定 。选出若干对,使得选中的 的最小值。

Solution

排序,枚举 双指针更新答案。

Code

void R()
{
	i64 n,k,ans=-1;
	cin>>n>>k;
	vector<pair<i64,i64>> a(n);
	for (auto &p:a) cin>>p.first;
	for (auto &p:a) cin>>p.second;
	sort(a.begin(),a.end());

	i64 sum=a[0].second;
	for (int l=0,r=0;l<n;sum-=a[l].second,l++)
	{
		while (sum<k)
		{
			r++;
			if (r>=n)
			{
				cout<<ans;
				return;
			}
			sum+=a[r].second;
		}
		if (ans==-1) ans=a[r].first-a[l].first;
		else ans=min(ans,a[r].first-a[l].first);
	}
	cout<<ans;
	return;
}
#牛客春招刷题训练营#
全部评论

相关推荐

昨天 12:33
安徽大学 Java
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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