Codeforces Round #251 (Div. 2)
C题:
题意:给定一些数字,要把这些数字方程k行,其中p行和为奇数,剩下和为偶数。
思路:根据奇数偶数的性质,先把p行放1个奇数,然后看看剩下的奇数是不是偶数个,如果不是肯定不满足,然后判断一下剩下的奇数个数/2加上偶数个数是否多余p个,如果不是肯定不满足,然后把这些放入p行,还有剩下的数字就全丢到最后一行去。
D题:
题意:给定两个序列,每次操作可以对序列中的数字进行+1或者-1,要使得a序列的最小大于b序列的最大,问最少需要几次操作。
思路:贪心,如果把序列合并再排序,那么前m小的肯定是序列b,后面都是序列a,因此合并后m那个位置就是a和b序列的分界点,然后在遍历两遍a和b,把不满足要求的去进行操作,求出操作次数。
代码:
C题:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
const int N = 100005;
int n, k, p, i, eve = 0;;
struct Num {
int v, oe;
} a[N];
vector<int> ans[N];
bool cmp(Num a, Num b) {
return a.oe > b.oe;
}
bool solve() {
int i = 0, tmp = 0, j;
for (;i < k - p; i++) {
tmp++;
if (a[i].oe == 0) return false;
ans[i].push_back(a[i].v);
}
if ((n - eve - (k - p)) % 2) return false;
if (eve + (n - eve - (k - p)) / 2 < p) return false;
for (j = i; j < n - eve; j += 2) {
if (tmp == k) break;
ans[tmp].push_back(a[j].v);
ans[tmp++].push_back(a[j + 1].v);
}
if (tmp == k) {
for (; j < n - eve; j++) {
ans[k - 1].push_back(a[j].v);
}
}
j = n - eve;
for (; j < n; j++) {
if (tmp == k) break;
ans[tmp++].push_back(a[j].v);
}
if (tmp == k) {
for (; j < n; j++)
ans[k - 1].push_back(a[j].v);
}
return true;
}
int main() {
scanf("%d%d%d", &n, &k, &p);
for (i = 0; i < n; i++) {
scanf("%d", &a[i].v);
a[i].oe = a[i].v % 2;
if (a[i].oe == 0)
eve++;
}
sort(a, a + n, cmp);
if (solve()) {
printf("YES\n");
for (int i = 0; i < k; i++) {
int t = ans[i].size();
printf("%d", t);
for (int j = 0; j < t; j++)
printf(" %d", ans[i][j]);
printf("\n");
}
}
else {
printf("NO\n");
}
return 0;
}
D题:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
const int N = 100005;
int n, m, a[N], b[N], c[N * 2], i;
int main() {
scanf("%d%d", &n, &m);
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
c[i] = a[i];
}
for (i = 0; i < m; i++) {
scanf("%d", &b[i]);
c[i + n] = b[i];
}
sort(c, c + n + m);
int tmp = c[m];
__int64 ans = 0;
for (i = 0; i < n; i++)
ans += max(0, tmp - a[i]);
for (i = 0; i < m; i++)
ans += max(0, b[i] - tmp);
printf("%I64d\n", ans);
return 0;
}
Codeforces Round #251 (Div. 2) C、D
时间: 2024-11-05 13:31:55