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 '\n' 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 '\n' 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; }