首页 > 其他分享 >codeforces 1804D Accommodation

codeforces 1804D Accommodation

时间:2023-04-07 23:00:39浏览次数:51  
标签:tmp pre cnt ++ sum codeforces num 1804D Accommodation

https://codeforces.com/problemset/problem/1804/D

解题思路

每个楼层是独立的,考虑怎么解决一层就可以了。

求最大值就是尽量避免1和1合并,也就是尽量在不存在连续1的子序列中进行合并,如果还有需要合并的就只能用1和1合并。求最小值就是尽量合并1和1。由于只需要输出最大最小值,所以遍历序列用贪心求解就行了。

/* https://codeforces.com/contest/1804/problem/D */
#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, m, pre, num[2], sum, tmp[2], cnt, Max, Min;

    while (scanf("%d %d", &n, &m) != EOF) {
        Max = Min = 0;
        for (int i = 0; i < n; i++) {
            pre = -1;
            num[0] = num[1] = 0;
            sum = tmp[0] = tmp[1] = 0;
            for (int j = 0; j < m; j++) {
                char c = getchar();
                if (c == '\n') {
                    j--;
                    continue;
                }

                cnt = c == '0' ? 0 : 1;
                sum += cnt;

                if (num[0] == 0) {
                    pre = cnt;
                    num[0]++;
                } else {
                    if (cnt == 0) {
                        pre = cnt;
                        num[0]++;
                    } else {
                        if (pre == 0) {
                            pre = cnt;
                            num[0]++;
                        } else {
                            pre = cnt;
                            tmp[0] += num[0] / 2;
                            num[0] = 1;
                        }
                    }
                }

                if (cnt == 0) {
                    if (num[1] != 0) {
                        tmp[1] += num[1]/2;
                        num[1] = 0;
                    }
                } else {
                    num[1]++;
                }
            }

            if (num[0] != 0) {
                tmp[0] += num[0]/2;
            }
            if (num[1] != 0) {
                tmp[1] += num[1]/2;
            }
            Max += sum - (m/4 - min(m/4, tmp[0]));
            Min += sum - min(m/4, tmp[1]);
        }
        cout << Min << " " << Max << endl;
    }
    return 0;
}

 

标签:tmp,pre,cnt,++,sum,codeforces,num,1804D,Accommodation
From: https://www.cnblogs.com/fwjonair/p/17297601.html

相关文章

  • Educational Codeforces Round 146 (Rated for Div. 2)
    A.Coins#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongintread(){intx=0,f=1,ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch......
  • Educational Codeforces Round 124 (Rated for Div. 2)
    题目链接C核心思路其实还是得根据样例,首先我们先自己分析出来。现根据边地数目来分析。我们其实不难发现四个端点必须得连上边。边数为2.那么只有两条竖线。方案数是一种边数为3,那么就一条竖线还有就是一把叉这里交换位置就是两条了。还有就是平行四边形和一条斜线,也是可以......
  • [CodeForces]4.7
    题目链接:https://codeforces.com/contest/1610/problem/E灵神描述输入t(≤1e4)表示t组数据。所有数据的n之和≤2e5。每组数据输入n(2≤n≤2e5)和长为n的有序数组a(1≤a[i]≤1e9),有重复元素。你需要从a中删除一些元素,对于a的任意非空子序列b,都必须满足:设avg为......
  • CodeForces - 149D Coloring Brackets(区间DP)
    题目大意:给你一个符合括号规则的字符串,现在要求你将这些括号染色,染色规则如下1.一个括号要么被染成红色,要么被染成蓝色,要么不染2.相邻的括号的颜色不能相同(可以同为无色)3.成对的括号只能有一个被染色问染色的方案数解题思路:0表示不染,1表示红色,2表示蓝色那么成对的括号......
  • codeforces 1793D Moscow Gorillas
    https://codeforces.com/contest/1793/problem/D解题思路依次找出MEX=1..n+1的序列数量就能得解。MEX=n+1只有全序列这一种情况。MEX=1时,找出两个序列中1的位置,较小位置左边的元素构成的子序列,较大位置右边的元素构成的子序列,以及两个位置中间的元素构成的子序列都满......
  • Codeforces Round 642 (Div3)
    K-periodicGarland给定一个长度位\(n\)的\(01\)串,每次操作可以将\(1\)变为\(0\)或者将\(0\)变为\(1\),现在你需要通过操作使得所有\(1\)之间的距离为\(k\),求最少的操作次数,注意全为\(0\)也算\(1<=n<=1e6,1<=k<=n\)\(dp\)/贪心:最大子段和思想方法一:\(dp\)\(O(n)\)状......
  • codeforces 1795E Explosions?
    https://codeforces.com/problemset/problem/1795/E解题思路问题的核心是要构造有一个先严格递增,然后严格递减的子序列。不在这个序列中的怪物单独击杀。先递增后递减可以看作是两个对称的问题,所以把递增序列的构造考虑清楚就可以了。假设已经知道将1~i-1构造成严格递增子序列所......
  • Codeforces Round 862 (Div. 2)
    CodeforcesRound862(Div.2)链接CodeforcesRound862(Div.2)A题#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<vector>#include<cstring>#include<unordered_set>#includ......
  • Codeforces Round 863 (Div. 3)
    CodeforcesRound863(Div.3)链接CodeforcesRound863(Div.3)A题遍历这个字符串,如果要插入的数第一次小于当前的数,就将数插入到这里,如果到最后都没有插入数,插入到最后#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<vec......
  • Codeforces Round 863 (Div. 3) E题
    题目地址题意:定义数组a包含所有不含数字4的正整数,给出一个n,要求求出数组a中第n个数Solution数位dp+二分,求出[1,mid]中不含数字4的正整数个数,不过因为有可能mid包含4,但是由于贡献是一样的,可以直接把4都变成3,最后处理一下即可intdp[20];inta[20];voidinit(){ dp[0]=1; f......