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

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

Easy 进制转换

简要题意

给定一个十六进制正数,将其转为十进制,保证数字在 int 范围内。

Solution

前两位的 0x 就不管它了,从第三位开始考虑。

每新添加一位数,数值相当于先前的数值乘上 ,再加上现在这位数,模拟这个过程就好。

Code

void R()
{
	string s;
	int x=0;
	cin>>s;
	for (int i=2;i<s.size();i++)
	{
		int p;
		if (s[i]>='A'&&s[i]<='F')
			p=10+(s[i]-'A');
		else p=s[i]-'0';
		x=x*16+p;
	}
	cout<<x;
	return;
}

Medium 合并表记录

简要题意

假定有一个初值为 的数组 (长度为 级别)。

给定 条指令 x y,表示让 加上 (其中 )。

对每个 ,按 的顺序输出

Solution

注意到下标域的规模较大,但是操作次数较小。我们可以用 map 或者 unordered_map 维护这个“数组”。

而迭代器遍历 map 是有序的,遍历 unordered_map 是乱序的(因为其原理是 Hash),我们直接用 map 维护操作,之后迭代器遍历 map 输出答案即可。

Code

void R()
{
	map<int,int> mp;
	int n;
	cin>>n;
	for (int i=0;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		mp[x]+=y;
	}
	for (auto [x,y]:mp)
		cout<<x<<' '<<y<<'\n';
	return;
}

Hard 称砝码

简要题意

给定 种砝码,每种砝码有 个,重量为

求这些砝码能表示的不同的重量数。

其中,

Solution

经典的背包问题。

注意到砝码总重不超过 ,直接维护一下当前哪些重量可以表示,依次考虑每个砝码。

考虑重量为 的砝码,如果考虑这个砝码前 可以表示,则考虑这个砝码后 可以表示。

注意这里的 要倒序枚举,避免一个砝码被重复使用多次。

Code

void R()
{
	constexpr int MAXN=2e5+7;
	int n,ans=0;
	cin>>n;
	vector<int> m(n),x(n),dp(MAXN);
	dp[0]=1;
	for (int &t:m) cin>>t;
	for (int &t:x) cin>>t;
	for (int i=0;i<n;i++)
		for (int j=0;j<x[i];j++)
			for (int k=MAXN-1;k>=m[i];k--)
				dp[k]|=dp[k-m[i]];
	for (int i=0;i<MAXN;i++)
		ans+=dp[i];
	cout<<ans<<'\n';
	return;
}
#牛客春招刷题训练营#
全部评论

相关推荐

MinJerous:虽然我一直说 计算机不怎么卡学历 但是至少得一本
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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