题目链接:
Dashboard - Codeforces Round 1008 (Div. 2) - Codeforces
题目A:
题目大意:
此题目可以这么理解:
给你一个长度为n的数组a和一个整数x,我们需要通过若干操作让数组长度变成1并且里面的数字为x
你可以进行以下操作任意次:
1.把数组切割成若干长度相等的数组(或者不切割,直接变成1),算出每个数组中的平均值,然后把每个数组的长度变成1,里面的元素为其平均值
解题思路:
关键点:不管怎么分,最后的结果都是整个数组的平均值
那么我们只需要判断平均值是否等于x即可
代码(C++):
#include <bits/stdc++.h>
int main() {
int tt;
std::cin >> tt;
while (tt--) {
int n, x;
std::cin >> n >> x;
int sum = 0;
for (int i = 0; i < n; i++) {
int v;
std::cin >> v;
sum += v;
}
if (sum % n == 0 && sum / n == x) {
std::cout << "YES\n";
} else {
std::cout << "NO\n";
}
}
}
题目B:
题目大意:
这题可以这么理解:
现在有n个房间排成一排,刚开始每一个房间都有一个人,对于其中一个房间i到出口的距离为n - i,现在你必须在每一个房间里面放一个传送器,传送器的功能是单向的传送到另一个指定的房间,并且不能传送到原本的房间,也就是说,必须传送出去。现在给你一个整数k,每个人连续不间断的必须传送k次。
你的目标,经过k次传送后,使得每个人离出口位置的距离之和最小。
你需要安排每个房间的传送器所传送的位置
解题思路:
关键点1: 最后两个房间互相传送
关键点2:把除了最后两个房间之外的人,传送到最后两个房间其中一个
关键点3:当传送k次之后,其中一个人在倒数第二个房间,其余的人在最后一个房间
我们首先把最后两个分别设置为n, n - 1
然后根据k的奇偶性来判断, 把除了最后两个房间之外的人,最开始是放在n房间还是n - 1房间
代码(C++):
#include <bits/stdc++.h>
int main() {
int tt;
std::cin >> tt;
while (tt--) {
int n, k;
std::cin >> n >> k;
std::vector<int> ans(n);
ans[n - 1] = n - 1;
ans[n - 2] = n;
if (k % 2 == 0) {
for (int i = 0; i < n - 2; i++) {
ans[i] = n - 1;
}
} else {
for (int i = 0; i < n - 2; i++) {
ans[i] = n;
}
}
for (int i = 0; i < n; i++) {
std::cout << ans[i] << " ";
}
std::cout << "\n";
}
}
题目C:
题目大意:
可以这么理解此题目
现在有一个长度为偶数的数组,你需要重新排列这个数组,并且在数组中添加一个数字,使得存在一个数字满足:
x = a1 - a2 + a3 - a4 + a5 - a6 + ... + a(2n - 1) - a(2n)
然后输出x和重新排列后的数组
解题思路:
关键点1:用一种的方法计算出x,并且输出此时的数组排列即可
关键点2: 可以排序,然后把最大的数字作为x,算出一个sum来构造一个顺序计算x
我们可以把数组从小到大排序,定义一个sum,减去前面n个数字,加上后面n个数字
那么sum = a(n + 1) + a(n + 2) + ... + a(2*n) - (a1 + a2 + ... + an)
我们可以用a(2 * n) 当x
也就是a(2 * n) = sum - a(2 * n - 1) + a(1) - a(2 * n - 2)....
把后面每一项减去,前面每一项加上,最后加上sum
代码(C++):
#include <bits/stdc++.h>
using i64 = long long;
int main() {
int tt;
std::cin >> tt;
while (tt--) {
int n;
std::cin >> n;
std::vector<int> a(2 * n);
for (int i = 0; i < 2 * n; i++) {
std::cin >> a[i];
}
std::sort(a.begin(), a.end());
i64 sum = 0;
for (int i = 0; i < 2 * n; i++) {
if (i < n - 1) {
sum -= a[i];
} else {
sum += a[i];
}
}
std::cout << a[2 * n - 1] << " " << sum << " " << a[2 * n - 2];
for (int i = 0; i < n - 1; i++) {
std::cout << " " << a[i] << " " << a[2 * n - 3 - i];
}
std::cout << "\n";
}
}
题目D:
题目大意:
本人菜菜,还在施工中