题解 CF554B Ohana Cleans Up & AcWing.3814 矩阵变换

这个题的意思是:给定一个 \(n \times n\)\(01\) 矩阵,可以修改若干列,求修改后最多有多少行的元素都为 \(1\),并输出这个数。

很明显这又是一道思维题,我们可以从中发现一些性质:设这个矩阵有 \(2\) 行:

  1. 当这 \(2\) 行完全相同时,则改变一列后,这一列的两个数仍相同。
  2. 当这 \(2\) 行不相同时,则改变一列后,这一列的两个数不同。

然后我们就可以发现:

  1. 行与行之间的相等不变。
  2. 任意行均可变成全 \(1\)

于是我们可以将问题转化成:统计每一行的次数,求出次数最大值就可以了。这样统计的话我们把每一行看作一个字符串,用一个哈希表就行了。

#include <iostream>
#include <unordered_map>
using namespace std;

int main()
{
    int n;
    cin >> n;
    unordered_map<string, int> cnt;
    while (n--)
    {
        string s;
        cin >> s;
        cnt[s]++;
    }
    int ans = 0;
    for (auto [k, v] : cnt) ans = max(ans, v);
    cout << ans << endl;
    return 0;
}
posted @ 2022-04-07 08:15  wbs200  阅读(49)  评论(0)    收藏  举报