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;
}
京公网安备 11010502036488号