文章目录
- [B. 小雷的神奇电脑](#B. 小雷的神奇电脑)
- C.岗位分配
- D.简单的素数
- F.小雷的算式
- H.聪明且狡猾的恶魔
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;
}