目录
B-小雷的神奇电脑_河南萌新联赛2024第(四)场:河南理工大学 (nowcoder.com)
D-简单的素数_河南萌新联赛2024第(四)场:河南理工大学 (nowcoder.com)
F-小雷的算式_河南萌新联赛2024第(四)场:河南理工大学 (nowcoder.com)
H-聪明且狡猾的恶魔_河南萌新联赛2024第(四)场:河南理工大学 (nowcoder.com)
I-马拉松_河南萌新联赛2024第(四)场:河南理工大学 (nowcoder.com)
B-小雷的神奇电脑_河南萌新联赛2024第(四)场:河南理工大学 (nowcoder.com)
思路:
同或运算的最大值,其实就是异或的最小值,求异或的最小值,值越接近的二进制位数相同的越多,异或则小。所以排个序,计算异或的最小值,再用最大减去异或的最小值,即为同或的最大值。
代码:
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
const int N = 1e6;
int a[N],s[N];
void slove()
{
int n, m;
cin >> n >> m;
int cnt = 1;
a[0] = 1;
for (int i = 1; i <= m; i++)
{
cnt *= 2;
a[i] = a[i - 1] + cnt;
}
int ans = 5e9;
for (int i = 0; i < n; i++)
cin >> s[i];
sort(s, s + n);
for (int i = 0; i < n-1; i++)
{
ans = min(ans, s[i] ^ s[i + 1]);
}
cout << a[m - 1] - ans;
}
signed main()
{
int t=1;
//cin >> t;
while (t--)
{
slove();
}
return 0;
}
D-简单的素数_河南萌新联赛2024第(四)场:河南理工大学 (nowcoder.com)
思路:
简单的素数判断
代码:
#include<iostream>
#define int long long
using namespace std;
int judge(int x)
{
if (x == 2)
return 1;
int flag = 0;
for (int i = 2; i * i <= x; i++)
{
if (x % i == 0)
{
flag = 1;
break;
}
}
if (flag == 1)
return 0;
else
return 1;
}
void slove()
{
int x;
cin >> x;
if (judge(x))
cout << "Yes\n";
else
cout << "No\n";
}
signed main()
{
int t;
cin >> t;
while (t--)
{
slove();
}
return 0;
}
F-小雷的算式_河南萌新联赛2024第(四)场:河南理工大学 (nowcoder.com)
思路:
读一个算一个
代码:
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
const int N = 1e6;
int a[N];
bool cmp(int a, int b)
{
return a > b;
}
void slove()
{
int cnt = 0, ans = 0;
while (1)
{
cin >> a[cnt++];
char tmp = getchar();
if (tmp == '\n' || tmp == EOF)
break;
}
sort(a, a + cnt,cmp);
for (int i = 0; i < cnt; i++)
{
ans += a[i];
if (i != 0)
cout << "+";
cout << a[i];
}
cout << "\n" << ans;
}
signed main()
{
int t=1;
//cin >> t;
while (t--)
{
slove();
}
return 0;
}
H-聪明且狡猾的恶魔_河南萌新联赛2024第(四)场:河南理工大学 (nowcoder.com)
思路:
手算一下,就找到规律了
代码:
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
const int N = 1e6;
int a[N];
void slove()
{
int n, x;
cin >> x >> n;
if(n%2==0)
cout << x - (n / 2)+1 << "\n";
else
cout<<x-(n/2)<<"\n";
}
signed main()
{
int t=1;
cin >> t;
while (t--)
{
slove();
}
return 0;
}
I-马拉松_河南萌新联赛2024第(四)场:河南理工大学 (nowcoder.com)
思路:
看成一棵树,深度搜索一遍从x到y和y到x,看一下有几个点不能到达,最后相乘一下
代码:
#include<iostream>
#include<cstring>
#include<vector>
#define int long long
using namespace std;
const int N = 1e6;
vector<int>e[N];
int vis[N],ans=1;
void dfs(int x, int y)
{
vis[y] = 1;
for (auto u : e[x])
{
if (vis[u] == 0 && u != x)
{
ans++;
dfs(u, x);
}
}
}
void slove()
{
int n, x, y;
cin >> n >> x >> y;
for (int i = 0; i < n - 1; i++)
{
int a, b;
cin >> a >> b;
e[a].push_back(b);
e[b].push_back(a);
}
ans = 1;
memset(vis, 0, sizeof(vis));
dfs(x, y);
int ans1 = n - ans;
memset(vis, 0, sizeof(vis));
ans = 1;
dfs(y, x);
int ans2 = n - ans;
cout << ans1 * ans2 << "\n";
}
signed main()
{
int t = 1;
while (t--)
{
slove();
}
return 0;
}