A考的性质、B简单模拟、C也是比较简单的模拟、D需要点思维、E考的组合数。
A
性质:相同数的异或值为0。对于C++而言没有抑或这一符号,对于C、Python3而言抑或的符号为:^,也可以用C或py来直接求解。py代码如下
print(0)
#print(x ^ x ^ x ^ x)
B
奇偶穿插即可,数量大的群体包裹较小的群体。注意若两数相等则取2倍,否则取较小的数二倍+1
c++ :
#include<bits/stdc++.h>
using namespace std;
long long x, y;
int main()
{
cin >> x >> y;
if (x != y)
cout << 2 * min(x, y) + 1 << endl;
else
cout << 2 * x << endl;
return 0;
}
C
既然连线的前提是相同x或者相同y,那么我们将每行或者每列的最大值以及最小值求出来,然后以O(N)的时间复杂度遍历每一行每一列即可求解
c ++
#include<bits/stdc++.h>
using namespace std;
const int N = 100050;
int n, m;
int xmax[N], xmin[N], ymax[N], ymin[N];
int main()
{
cin >> n >> m;
memset(xmin, 0x3f3f3f3f, sizeof xmin);
memset(ymin, 0x3f3f3f3f, sizeof ymin);
for(int i = 0; i < m; i ++ )
{
int x, y;
cin >> x >> y;
xmax[x] = max(xmax[x], y);//记录每一行y值最大的
xmin[x] = min(xmin[x], y);//记录每一行y值最小的
ymax[y] = max(ymax[y], x);//记录每一列x值最大的
ymin[y] = min(ymin[y], x);//记录每一列x值最大的
}
int ans = 0;
for(int i = 1; i <= n; i ++ )
ans = max({ans, xmax[i] - xmin[i], ymax[i] - ymin[i]});
cout << ans << endl;
return 0;
}
D
先对数组进行排序,如果当前数位上的数 大于前面所有数位的数字之和,那么一定不满足,且不能被表示出来的数即为和
py3
n = int(input())
def solve():
x = int(input())
a = list(map(int, input().split()))
a.sort()
sum = 1#初始化为最小的无法表示的数1
for j in a:
if j > sum:#如果当前的数大于前面数字之和,那么就无法表示sum
print(sum)
return
else:
sum += j#否则的话,累加
if sum > x:#如果以及超过了x,那么就能表示出1~x之间的数,提前结束即可
break
print("Cool!")
for i in range(n):
solve()
c++
#include<bits/stdc++.h>
using namespace std;
int t, a[100050];
void solve()
{
int n;
cin >> n;
for(int i = 1; i <= n; i ++ ) cin >> a[i];
sort(a + 1, a + n + 1);
int sum = 1;
for(int i = 1; i <= n; i ++ )
{
if(a[i] > sum)
{
cout << sum << endl;
return;
}
else sum += a[i];
if(sum > n)//这里一定是大于n,因为我们的sum初始值为1
break;
}
cout << "Cool!" << endl;
}
int main()
{
cin >> t;
while(t -- ) solve();
return 0;
}
E
两根杆子起始时分别位于点1、n,那么最多可移动n - 2次。除了最后一次折返跑可以不移动,那么必须移动m - 1次。那么问题就转化成了将m - 1个球放进n - 2个篮子里,问有多少种方案,那么即是 组合数 问题
由于数据范围较大,采用逆元求解
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int P = 1e9 + 7, N = 1e6 + 10;
int infact[N], fact[N];
//快速幂
int quick_mi(int a, int k)
{
int res = 1;
while(k)
{
if(k & 1) res = (LL)res * a % P;
k = k >> 1;
a = (LL)a * a % P;
}
return res;
}
//预处理阶乘以及逆元
void fac()
{
fact[0] = infact[0] = 1;
for(int i = 1; i <= N; i ++ )
{
fact[i] = (LL)fact[i - 1] * i % P;
infact[i] = (LL)quick_mi(i, P - 2) * infact[i - 1] % P;
}
}
int main()
{
fac();
int n;
cin >> n;
while(n -- )
{
int a, b;
cin >> a >> b;
if (b == 1)
cout << "1" << endl;
else
cout << (LL) fact[a - 2] * infact[a - b - 1] % P * (LL) infact[b - 1] % P << endl;//组合数的转换
}
}