河南萌新联赛2024第(四)场:河南理工大学

文章目录

B. 小雷的神奇电脑

题意

给你n个数输出一个整数,这个整数是在这个数组任意两个数同或的最大值
同或:

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

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

思路

因为同或与异或是相反操作所以我们可以求异或最小值再用2^m^减异或最小值就是同或的最大值

代码

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
int a[200100];
map<int,int>ma;
signed main() {
	IOS
	int T = 1;
	//cin>>T;
	while (T--) 
	{
		int n,m,f=0,mi=1e18;
        cin>>n>>m;
        int t=pow(2,m)-1;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        sort(a+1,a+1+n);
        for(int i=1;i<n;i++)
        {
            mi=min(mi,a[i]^a[i+1]);
        }
         cout<<t-mi<<endl;   
	}
	return 0;
}

C.岗位分配

题意

有众多志愿岗位需要被分配,给你志愿者人数和一个数组数组中的值是每个地方要分配的最小值,求可能的分配情况总数。

思路

先把至少要分配几人用总数减去,然后再把剩下的人分配到岗位上有几种分配方法,岗位可以分配0人,然后用排列组合的方法就能求出来,大家可以看下边图片就可以得到公式了

代码

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
const int N=100010, P=998244353;
int f[N], g[N];

int qpow(int a, int b){
  int res = 1;
  while(b){
    if(b & 1) res=res*a%P;
    a = a*a%P;
    b >>= 1;
  }
  return res;
}
void init(){
  f[0] = g[0] = 1;
  for(int i=1; i<N; i++){
    f[i] = f[i-1]*i%P;
    g[i] = g[i-1]*qpow(i,P-2)%P;
  }  
}
int getC(int n, int m){
  return f[n]*g[m]%P*g[n-m]%P;
}
signed main()
{
	IOS
    init();
	int T=1,a;
	//cin>>T;
	while(T--)
	{
		int m,n,sum=0;
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            cin>>a;m-=a;
        }
        for(int i=0;i<=m;i++)
            sum=(sum+getC(i+n-1,n-1))%P;
        cout<<sum%P<<endl;
	}
	return 0;
}

D.简单的素数

题意

给一个数看是否是素数

思路

直接暴力求素数就行了

代码

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;

signed main() {
	IOS
	int T = 1;
	cin>>T;
	while (T--) 
	{
		int n,f=0;
		cin>>n;
		for(int i=2;i*i<=n;i++)
		{
			if(n%i==0)
			{
				f=1;
				break;
			}
		}
		if(f==1)
		cout<<"No"<<endl;
		else
		cout<<"Yes"<<endl;
	}
	return 0;
}

F.小雷的算式

题意

给以一个字符串,字符串只有数字和加号,输出从大到小写下自己的算式并算出答案

思路

直接模拟一遍就行了,遇见数子存起来,遇见加号求和,再把数字用数组存起来排序输出就行

代码

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;

bool cmp(int x, int y) {
	return x > y;
}

signed main() {
	IOS
	int T = 1;
	//cin>>T;
	while (T--) {
		vector<int>v;
		int sum = 0, t = 0;
		string s;
		cin >> s;
		for (int i = 0; i < s.size(); i++) {
			if (s[i] == '+') {
				sum += t;
				v.push_back(t);
				t = 0;
			} else {
				t = t * 10 + (s[i] - '0');
			}
		}
		v.push_back(t);
		sum += t;
		sort(v.begin(), v.end(), cmp);
		for (int i = 0; i < v.size(); i++) {
			if (i == v.size() - 1)
				cout << v[i] << endl;
			else
				cout << v[i] << "+";
		}
		cout << sum << endl;
	}
	return 0;
}

H.聪明且狡猾的恶魔

思路

这个题我觉得有问题就是在恶魔数量等于3时我觉得应该输出零,但答案并不是

代码

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;

signed main() {
	IOS
	int T = 1;
	cin >> T;
	while (T--) {
		int n, x;
		cin >> x >> n;
		if (n == 1 || n == 2)
			cout << x << endl;
		else if ((n - 1) % 2 == 0)
			cout << max((int)0, x - n / 2) << endl;
		else
			cout << max((int)0, x - (n - 1) / 2) << endl;
	}
	return 0;
}
相关推荐
lxyzcm12 分钟前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23
蜀黍@猿30 分钟前
C/C++基础错题归纳
c++
雨中rain1 小时前
Linux -- 从抢票逻辑理解线程互斥
linux·运维·c++
ALISHENGYA2 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战项目二)
数据结构·c++·算法
arong_xu2 小时前
现代C++锁介绍
c++·多线程·mutex
汤姆和杰瑞在瑞士吃糯米粑粑2 小时前
【C++学习篇】AVL树
开发语言·c++·学习
DARLING Zero two♡2 小时前
【优选算法】Pointer-Slice:双指针的算法切片(下)
java·数据结构·c++·算法·leetcode
CodeClimb2 小时前
【华为OD-E卷-木板 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
奶香臭豆腐3 小时前
C++ —— 模板类具体化
开发语言·c++·学习
不想当程序猿_3 小时前
【蓝桥杯每日一题】分糖果——DFS
c++·算法·蓝桥杯·深度优先