河南萌新联赛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;
}
相关推荐
Ysjt | 深2 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
ephemerals__2 小时前
【c++丨STL】list模拟实现(附源码)
开发语言·c++·list
Microsoft Word2 小时前
c++基础语法
开发语言·c++·算法
一只小小汤圆3 小时前
opencascade源码学习之BRepOffsetAPI包 -BRepOffsetAPI_DraftAngle
c++·学习·opencascade
legend_jz3 小时前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法
嘿BRE3 小时前
【C++】几个基本容器的模拟实现(string,vector,list,stack,queue,priority_queue)
c++
ö Constancy4 小时前
c++ 笔记
开发语言·c++
fengbizhe4 小时前
笔试-笔记2
c++·笔记
徐霞客3204 小时前
Qt入门1——认识Qt的几个常用头文件和常用函数
开发语言·c++·笔记·qt