河南萌新联赛2024第(四)场

题目链接:河南萌新联赛2024第(四)场:河南理工大学_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ

1.小雷的神奇电脑

同或概念:

• 如果两个输入位相同,则输出为1
• 如果两个输入位不同,则输出为0 

所以可以发现规律,最大同或一定出现在相邻两个数(二进制下位相同多),同时利用补位异或实现同或的功能

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	int n, m;
	vector<int> nums1;
	cin >> n >> m;
	while (n--)
	{
		int num;
		cin >> num;
		nums1.push_back(num);
	}
	sort(nums1.begin(),nums1.end());
	int max1 = 0;
	for (int i = 0; i < nums1.size()-1; i++)
	{
		int ans = ~(nums1[i] ^ nums1[i+1]) & ((1 << m) - 1); // 计算同或值
		max1 = max(max1, ans);
	}
	cout << max1 << endl;

	return 0;
}
2.简单的素数
#include <iostream>
using namespace std;

bool is_prime(int n)
{
	if (n < 2) return false; // 0 和 1 不是质数
	for (int i = 2; i * i <= n; i++)
	{
		if (n % i == 0) return false; // 有因子,返回 false
	}
	return true; // 没有因子,返回 true
}

int main()
{
	int num,t;
	cin>>t;
	while(t--)
	{
		cin >> num;
		if (is_prime(num))
		{
			cout << "Yes" << endl; // 是质数
		}
		else
		{
			cout << "No" << endl; // 不是质数
		}
	}
	return 0;
}
3.AND 

1.发现子区间and和为0规律:大于2或者质数唯一则符合条件的子区间为0,质数大于2的等于sum-2
2.首先筛选法求出质数(减少时间复杂度),然后二分法查找质数个数(减少空间复杂度) 

#include <iostream>
#include <vector>
using namespace std;
bool sum[100000010];  // 存储是否被筛掉
vector<int> prime;    // 存储素数

void op(int n)
{
	sum[1] = 1;  // 1 不是素数
	for (int i = 2; i <= n; i++)
	{
		if (!sum[i]) prime.push_back(i);  // 如果 i 是素数,添加到 prime
		for (int j : prime)
		{
			if (j * i > n) break;  // 超过范围时停止
			sum[j * i] = 1;        // 筛掉倍数
			if (i % j == 0) break; // 如果 i 是 j 的倍数,停止
		}
	}
}
int main()
{
	op(100000000);  // 生成素数
	int t;
	cin >> t;  // 输入测试用例数量
	while (t--)
	{
		int x, y;
		cin >> x >> y;  // 输入范围 x 和 y
		int count = 0, l1 = 0, r1 = prime.size() - 1, l2 = 0, r2 = r1;
		// 二分查找 x 在 prime 中的位置
		while (l1 < r1)
		{
			int m = l1 + r1 >> 1;
			if (prime[m] < x) l1 = m + 1;
			else r1 = m;
		}
		// 二分查找 y 在 prime 中的位置
		while (l2 < r2)
		{
			int m = l2 + r2 >> 1;
			if (prime[m] < y) l2 = m + 1;
			else r2 = m;
		}

		if (prime[l2] > y) l2--;  // 确保 l2 在 y 的范围内
		count = l2 - l1 + 1;      // 计算在 [x, y] 范围内的质数个数

		// 输出结果
		cout << count << ' ';
		if (x > 2 || count == 1)
		{
			cout << 0 <<endl;  // 如果 x > 2 或者质数个数为 1
		}
		else if (count >= 2)
		{
			cout << count - 2 << endl;  // 质数个数大于等于 2
		}
	}
	return 0;
}
 4.小雷的算式
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string s,temp;
vector<int>nums;
int sum=0,temp1;
int main()
{
	cin>>s;
	for(int i=0; i<s.size(); i++)
	{

		if(s[i]!='+')
		{
			temp+=s[i];
		}
		if (s[i]=='+'||i==s.size()-1)
		{
			temp1=stoi(temp);
			nums.push_back(temp1);
			sum+=temp1;
			temp.clear();
		}
	}
	sort(nums.begin(),nums.end(),greater<int>());//不要用string存储和排序(string排序逐字符比较,不看字符串长度)
	for(int i=0; i<nums.size()-1; i++)
	{
		cout<<nums[i]<<"+";
	}
	cout<<nums[nums.size()-1]<<endl<<sum<<endl;
	return 0;
}
 5.聪明且狡猾的恶魔

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	int t;
	cin >> t; // 读取测试数据的数量
	while (t--)
	{
		int x, n;
		cin >> x >> n; // 读取金币数量和恶魔数量
		// 计算可以获得的最多金币
		int k = (n + 1) / 2 - 1; // 需要至少支持的恶魔数量
		int max1 = x - k; // 老大能够获得的金币数量
		cout << max1 << endl; // 输出结果
	}
	return 0;
}
  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值