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

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

Codeforces Round #251 (Div. 2) C、D的相关文章

*Codeforces Round #251 (Div. 2)AK)

A.确定性数学计算,水,读题要快 1 #include<iostream> 2 #include<stdio.h> 3 4 using namespace std; 5 int N,d; 6 int main(){ 7 while(~scanf("%d%d",&N,&d)){ 8 int cnt=0; 9 for(int i=0;i<N;i++){ 10 int t; 11 scanf("%d",&t); 12

Codeforces Round #251 (Div. 2) C. Devu and Partitioning of the Array

注意p的边界情况,p为0,或者 p为k 奇数+偶数 = 奇数 奇数+奇数 = 偶数 #include <iostream> #include <vector> #include <set> #include <algorithm> #include <cmath> using namespace std; int main(){ int n,k,p; long a; cin >> n >> k >> p; ve

Codeforces Round #250 (Div. 2) C、The Child and Toy

注意此题,每一个部分都有一个能量值v[i],他移除第i部分所需的能量是v[f[1]]+v[f[2]]+...+v[f[k]],其中f[1],f[2],...,f[k]是与i直接相连(且还未被移除)的部分的编号. 注意题目移除的都是与第i部分直接相连的部分的能量值, 将本题目简化得,只考虑两个点1和2,1和2相连,1的能量值是10,2的能量值是20, 移除绳子时,要保持能量最小,可以移除部分2,这样移除的能量就是与2相连的部分1的能量即是10: 故每次相连两部分都移除能量值大的即可 #includ

Codeforces Round #251 (Div. 2) B. Devu, the Dumb Guy

注意数据范围即可 #include <iostream> #include <vector> #include <algorithm> using namespace std; int main(){ long long n,x; cin >> n >> x; vector<long long> c(n); for(int i = 0 ; i < n; ++ i) cin >> c[i]; sort(c.begin(

Codeforces Round #251 (Div. 2) A - Devu, the Singer and Churu, the Joker

水题 #include <iostream> #include <vector> #include <algorithm> using namespace std; int main(){ int n,d,t; cin >> n >> d; for(int i = 0 ; i < n; ++ i){ cin >> t; d-=t; } d-=(n-1)*10; if(d < 0) cout<<-1<<

Codeforces Round #298 (Div. 2) A、B、C题

题目链接:Codeforces Round #298 (Div. 2) A. Exam An exam for n students will take place in a long and narrow room, so the students will sit in a line in some order. The teacher suspects that students with adjacent numbers (i and i + 1) always studied side

Codeforces Round #604 (Div. 2) D、E、F题解

Beautiful Sequence \[ Time Limit: 1000 ms\quad Memory Limit: 256 MB \] 首先我们可以考虑到 \(0\) 只能 和 \(1\) 放在一起.\(3\) 只能和 \(2\) 放在一起,那么我们想办法先把 \(0\) 和 \(3\) 凑出来,最后就剩下 \(1\) 和 \(2\) 了,我们只要把他们放在一起就可以了. 所以我们可以贪心考虑三个 \(string\),分别长成 \(0101...0101\).\(2323...2323\

Codeforces Round #285 (Div. 2) (A、B、C、D)

A:就根据题意计算比较一下即可 B:从每个起点往后走一遍走到底,输出即可,字符串直接map映射掉 C:类似拓扑排序,从临接个数为1的入队,那么临接Xor和,其实就是他的上一个结点,因为他只临接了一个结点,这样利用拓扑排序,当一个结点的度数为1的时候入队即可,注意要判断一下度数0的情况,直接continue D:利用树状数组去求这种大的全排列数,其实一个全排列 ,可以看成a1 * (n - 1)! + a2 * (n - 2)!....,那么其实只要处理出每一项的系数,然后在由系数就可以求出变换后

Codeforces Round #287 (Div. 2) A、B、C、D、E

A:签到题,排序判断一下能学几门即可 B:圆心可以每步可以移动2 * r的距离,方向任选,所以答案是ceil(两点距离 / 2 / r) C:递归下去就可以了,dfs(h, n, flag),h表示当前到哪层,n表示当前层下的出口相对位置,flag表示下一步往左还是往右 D:数位DP,从最低位往最高位去放数字,如果一旦出现取模为0,就可以直接计算种数位后面还剩多少位,最后一位可以放1-9,其他都是0-9,不然就继续记忆化搜下去 E:最短路,把图建起来,假设1边总数为x,选择的路径上1边数位a,0