CF21804D Accommodation (贪心,特别注意这个实现过程,减法思维)

 

 

 

 

别人的思路;  

  • 对于第一个问题求最小: 尽可能让连续的2个1放一个房间就行,最多m/4
  • 对于第二个问题: 尽可能让不是11连续的位置为 double公寓, 因为每有2个1就会减少一个 ans,(先想出所有的1然后利用减法思维,很巧妙)
  • 2个2个判断的时候 +2的思想很妙
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
using LL = long long;

int main(){

    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);

    int n, m;
    cin >> n >> m;
    int mn = 0, mx = 0;
    while(n--){
        string s;
        cin >> s;
        int cnt1 = count(s.begin(), s.end(), '1');
        {
            int cnt11 = 0;
            for(int i = 0; i < m; i++){
                if (s[i] == '0') continue;
                if (i + 1 < m && s[i + 1] == '1'){
                    cnt11 += 1;
                    i++;
                }
            }
            mn += cnt1 - min(cnt11, m / 4);
        }
        {
            int cnt00 = 0;
            for(int i = 0; i < m; i++){
                if (i + 1 < m && ((s[i] != s[i + 1]) || s[i] == '0')){
                    cnt00 += 1;
                    i++;
                }
            }
            if (cnt00 <= m / 4){
                mx += cnt1 - (m / 4 - cnt00);
            }
            else{
                mx += cnt1;
            }
        }
    }
    cout << mn << ' ' << mx << '\n';

}
View Code

 

posted @ 2023-03-13 22:56  VxiaohuanV  阅读(25)  评论(0编辑  收藏  举报