码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #251 (Div. 2) C、D

时间:2014-06-08 17:01:05      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:c   style   class   code   a   color   

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,布布扣,bubuko.com

Codeforces Round #251 (Div. 2) C、D

标签:c   style   class   code   a   color   

原文地址:http://blog.csdn.net/accelerator_/article/details/28852377

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!