A.Non-zero

题意

对数组中任意一个数字执行不限次数的加一操作(ai = ai+1)
使数组中所有元素的和、乘积都不等于零

思路

1.首先数组中不能存在0 否则乘积一定为0 所以 记录数组中0出现的次数cnt 对每个0都进行+1操作 ans += cnt
2. 第一步保证了数组元素的乘积不等于0 要想使和不为零
设原始数组中 各元素的和为sum 若 sum + cnt == 0 则只需对
数组中的任何一个元素进行+1操作即可 ans += 1
输出答案即可

#include<bits/stdc++.h>
using namespace std;
int a[105];
int main()
{
    int t;cin >> t;
    while (t--) {
        int sum = 0;
        int cnt = 0, ans = 0;
        int n;cin >> n;
        for (int i = 1;i <= n;++i) {
            int val;cin >> val;
            if (val == 0)++cnt;
            sum += val;
        }
        if (cnt != 0)ans += cnt;
        if (sum + cnt == 0)ans += 1;
        cout << ans << endl;
    }
}

B.Assigning to Classes

题意

将偶数个学生分到两个班里 使两个班里的成绩中位数之差最小

思路

sort()排序 第奇数个学生分一组 第偶数个学生分一组
可以保证中位数之差最小
ps(注意开的数组大小是2*n!!!Wa了一发就很难受)

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6;
int a[N];
typedef long long ll;
int main()
{
    ll  t;cin >> t;
    while (t--) {
        ll n;cin >> n;
        memset(a, 0, sizeof(int));
        for (ll i = 1;i <= 2 * n;++i) {
            cin >> a[i];
        }
        sort(a + 1, a + 2ll*n + 1);
        ll ans = abs(a[n + 1] - a[n]);
        cout << ans << endl;
    }
    return 0;
}

C. Anu Has a Function

题意:

给你一个不超过1e5的数组 再给你一个方程式f(x,y) == (x|y)-y 即x按位或y-y
调整数组中元素的个数 使最终结果最大
显然是规律题
举例 x == 110111 y == 10101
x|y == 110111
-y = 100010
对比一下 110111
--------------10101
-------------100010
可以发现 如果某一位上的1在整个数组中出现了不止一次 肯定会变成0
所以解决办法是 找出数组中元素二进制某位上只出现一次1的最高位 把这个元素放在最前面即可

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mod 1000000007
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define endl &#39;\n&#39;

using namespace std;
typedef long long ll;

const int maxn = 1e5 + 10;
int a[maxn];
int main() {
    int n;cin >> n;
    int ans;
    for (int i = 1;i <= n;++i) cin >> a[i];
    for (int j = 30;j >= 0;--j) {//1e9的数据30足够了
        int num = 0;ans = 1;
        for (int i = 1;i <= n;++i) {
            if ((a[i] >> j) & 1) {
                ++num;
                ans = i;
            }
        }
        if (num == 1)break;
    }
    printf("%d ", a[ans]);
    for (int i = 1;i <= n;++i) {
        if (i != ans)printf("%d ", a[i]);
    }
    return 0;
}

D. Aerodynamic

题意:

给定一个严格意义上的凸多边形P,问通过平移能否构成一个与P相似的多边形T

思路:

若n为奇数 则肯定不符合题意
然后判断第i个顶点与第n/2+i 图片说明 个顶点的中点是否唯一即可

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mod 1000000007
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define endl &#39;\n&#39;

using namespace std;
typedef long long ll;

const int maxn = 1e5 + 10;
int a[maxn], b[maxn];
int main() {
    int n;cin >> n;
    for (int i = 1;i <= n;++i)cin >> a[i] >> b[i];
    if (n & 1)printf("NO\n");
    else {
        for (int i = 1;i <= n / 2;++i) {
            if (a[i] + a[n / 2 + i] != a[1] + a[n / 2 + 1] || b[i] + b[n / 2 + i] != b[1] + b[n / 2 + 1]) {
                printf("NO\n");
                return 0;
            }
        }
        printf("YES\n");
    }
    return 0;
}