题目链接:河南萌新联赛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;
}
标签:prime,联赛,int,质数,cin,2024,l2,萌新,nums1
From: https://blog.csdn.net/2301_77869606/article/details/141037534