牛客小白月赛71

链接:牛客小白月赛71_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ

A:猫猫与广告

观察题目,让我们找到一个牌子去遮挡一下另一块牌子,考虑到边对齐,直接进行判断即可,判断的时候记得考虑短边对短边,长边对长边就行;

代码:

#include <iostream>
using namespace std;
int main()
{
	int a,b,c,d;
	cin >> a >> b >> c >> d;
	if(a > b)swap(a,b);
	if(c > d)swap(c,d);
	if(c >= a && d >= b)cout << "YES" << endl;
	else cout << "NO" << endl;
	return 0;
} 

B:猫猫与密信

这里问我们能不能找到love或者任意删除一个字母后字符串,可以直接暴力判断,这里我使用find函数进行查找,这里查找love可以不写,因为查找ove的时候也可以查找到love;

代码:

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
	string s;
	cin >> s;
	int flag = 0;
	if(s.find("ove") != -1 || s.find("lve") != -1 || s.find("loe") != -1 || s.find("lov") != -1)flag = 1;
	if(flag)cout << "YES" << endl;
	else cout << "NO" << endl;
	return 0;
} 

C:猫猫与数列

我们看一下,会发现就算是最小的情况两个数字都为一,答案也就是5,也就是最多不乘超过五次,那么我们这时候就可以直接暴力。

考虑的每次都是倍数增加就算是最小的2,乘64次之后也会超过LL,所以我们直接进行进行for循环,这样有效避免哦我们的溢出问题,只要发现溢出直接退出即可;

代码:

#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
int main()
{
	ll p,q;
	cin >> p >> q;
	ll t = 1;
	ll idx = 0;
	for(int i = 3;;i ++ )
	{
		int flag = 1;
		t = 1;
		for(int j = 1;j <= q;j ++ )
		{
			t *= p;
			if(t > 1e18)
			{
				flag = 0;
				idx = i - 1;
				break;
			}
		}
		swap(p,q);
		q = t;
		if(!flag)break;
	}
	cout << idx << endl;
	return 0;
} 

D:猫猫与主人

首先我们观察这个序列,我们发现对于每一个猫猫,只要某个主人的期望友善值在这只猫猫的友善值以下,我们就可以找到一个最大的友善值的主人分给这只猫猫,因为同一个主人可以多次分配,所以不用考虑这个问题。

接着我们发现应该先把主人按期望友善值排序,之后把友善值进行前缀和,求出每个主人及其比他的期望值小的主人他们最大友善值。因为当期望值为9的主人能领养某只猫猫,那么期望值在9一下的主人肯定也能领养这只猫猫,只是友善值不同;

接着对于每一只猫猫,找到对应他的友善值的最大期望值,取出最大友善值,与猫猫的友善值判断,如果还达不到猫猫的期望友善值,说明没有答案,否则就把这个最大友善值分配给这只猫猫。

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;

#define x first
#define y second
typedef pair<int, int> PII;
const int N = 2e5 + 10;
PII cat[N], per[N];
int ans[N];

int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>cat[i].x;
	for(int i=1;i<=n;i++) cin>>cat[i].y;
	for(int i=1;i<=m;i++) cin>>per[i].y;
	for(int i=1;i<=m;i++) cin>>per[i].x;
	sort(per+1,per+1+m);
	
	for(int i=1;i<=m;i++)
	{
		ans[i]=max(ans[i-1],per[i].y);
	}
	for(int i=1;i<=n;i++)
	{
		int l=1,r=m;
		while(l<r)
		{
			int mid=(l+r+1)/2;
			if(per[mid].x>cat[i].x) r=mid-1;
			else l=mid;
		}
		if(cat[i].y<=ans[l]) cout<<ans[l]<<' ';
		else cout<<-1<<' ';
	}
}

E:猫猫与数学

首先我们需要直到有这样一个公式:gcd(a,b)=gcd(a,b-a)。

所以对于这个题目,gcd(a+c,b+c)=gcd(a+c,b-a);

那么对于b-a的所有质因子,我们只需要找到a+c使其能够整除即可。那么基于此我们对b-a进行质因数分解,我们规定b=b-a,只要b%i==0,那么此时我们需要a+c|i,c=i-a%i,对答案进行更新即可,记得把b的这个公因子给除尽。

如果最后发现b仍然大于0,说明需要再更新一次答案。

代码:

#include<iostream>

using namespace std;

typedef long long LL;
LL gcd(LL a,LL b)
{
	return b?gcd(b,a%b):a;
}

int main()
{
	LL n,m;
	cin>>n>>m;
	if(n>m) swap(n,m);
	if(gcd(n,m)>1)
	{
		cout<<0;
	} 
	else
	{
		m-=n;
		if(m==0)
		{
			cout<<1;
		}
		else if(m==1)
		{
			cout<<-1;
		}
		else 
		{
			LL ans=1e18;
			for(LL i=2;i<=m/i;i++)
			{
				if(m%i==0)
				{
					ans=min(ans,i-n%i);
					while(m%i==0) m/=i;
				}
			}
			if(m>1) ans=min(ans,m-n%m);
			cout<<ans;
		}
	}
} 
/*
2 1000000009
*/

### 关于小白109的信息 目前并未找到关于小白109的具体比信息或题解内容[^5]。然而,可以推测该事可能属于网举办的系列算法之一,通常这类比会涉及数据结构、动态规划、图论等经典算法问题。 如果要准备类似的事,可以通过分析其他场次的比题目来提升自己的能力。例如,在小白13中,有一道与二叉树相关的题目,其核心在于处理树的操作以及统计最终的结果[^3]。通过研究此类问题的解决方法,能够帮助理解如何高效地设计算法并优化时间复杂度。 以下是基于已有经验的一个通用解决方案框架用于应对类似场景下的批量更新操作: ```python class TreeNode: def __init__(self, id): self.id = id self.weight = 0 self.children = [] def build_tree(n): nodes = [TreeNode(i) for i in range(1, n + 1)] for node in nodes: if 2 * node.id <= n: node.children.append(nodes[2 * node.id - 1]) if 2 * node.id + 1 <= n: node.children.append(nodes[2 * node.id]) return nodes[0] def apply_operations(root, operations, m): from collections import defaultdict counts = defaultdict(int) def update_subtree(node, delta): stack = [node] while stack: current = stack.pop() current.weight += delta counts[current.weight] += 1 for child in current.children: stack.append(child) def exclude_subtree(node, total_nodes, delta): nonlocal root stack = [(root, False)] # (current_node, visited) subtree_size = set() while stack: current, visited = stack.pop() if not visited and current != node: stack.append((current, True)) for child in current.children: stack.append((child, False)) elif visited or current == node: if current != node: subtree_size.add(current.id) all_ids = {i for i in range(1, total_nodes + 1)} outside_ids = all_ids.difference(subtree_size.union({node.id})) for idx in outside_ids: nodes[idx].weight += delta counts[nodes[idx].weight] += 1 global nodes nodes = {} queue = [root] while queue: curr = queue.pop(0) nodes[curr.id] = curr for c in curr.children: queue.append(c) for operation in operations: op_type, x = operation.split(' ') x = int(x) target_node = nodes.get(x, None) if not target_node: continue if op_type == '1': update_subtree(target_node, 1) elif op_type == '2' and target_node is not None: exclude_subtree(target_node, n, 1) elif op_type == '3': path_to_root = [] temp = target_node while temp: path_to_root.append(temp) if temp.id % 2 == 0: parent_id = temp.id // 2 else: parent_id = (temp.id - 1) // 2 if parent_id >= 1: temp = nodes[parent_id] else: break for p in path_to_root: p.weight += 1 counts[p.weight] += 1 elif op_type == '4': pass # Implement similarly to other cases. result = [counts[i] for i in range(m + 1)] return result ``` 上述代码片段展示了针对特定类型的树形结构及其操作的一种实现方式。尽管它并非直接对应小白109中的具体题目,但它提供了一个可借鉴的设计思路。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值