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

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

Easy 求最大连续bit数

简要题意

给一个整数,求其二进制表示下最长连续 1 的长度。

Solution

反复右移逐位判断即可。

Code

void R()
{
	int n,len=0,ans=0;
	cin>>n;
	while (n)
	{
		if (n&1) len++,ans=max(ans,len);
		else len=0;
		n>>=1;
	}
	cout<<ans;
	return;
}

Medium 小红的排列构造

简要题意

给定 ,构造排列 使得:

时, 不构成排列;

时, 构成排列。

无解则输出

Solution

贪婪地,如果 我们在位置 放置前面未出现的最小的数,否则放第二小的。

当至少有两个数未放置时,一定符合题意。

问题在于如果 一定是一个排列,此时报告无解。

Code

void R()
{
	int n;
	string s;
	cin>>n>>s;
	set<int> st;
	if (s.back()=='0')
	{
		cout<<-1;
		return;
	}
	for (int i=1;i<=n;i++)
		st.insert(i);
	for (char c:s)
	{
		auto it=st.begin();
		if (c=='0') it++;
		cout<<*it<<' ';
		st.erase(it);
	}
	return;
}

Hard [NOIP2001]装箱问题

简要题意

给一个容量为 的背包和 个体积为 的物品,求向包中放入某些物品后,背包剩余空间的最小值。

Solution

很板的背包 dp 。

代表背包已占用 空间的方案数。

考虑放入一个体积为 的物品,有转移:

然后找 数组中最大的有值的位置就好。

其实我们只在意有没有方案,不在意方案数是多少,所以直接取或转移也行。

Code

void R()
{
	int V,n;
	cin>>V>>n;
	vector<int> dp(V+1);
	dp[0]=1;
	for (int i=0;i<n;i++)
	{
		int x;
		cin>>x;
		for (int j=V;j>=x;j--)
			dp[j]|=dp[j-x];
	}
	for (int i=V;i>=0;i--)
		if (dp[i])
		{
			cout<<V-i;
			return;
		}
	return;
}
#牛客春招刷题训练营#
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-18 16:15
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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