首页 > 试题广场 >

翻之

[编程题]翻之
  • 热度指数:3617 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1024M,其他语言2048M
  • 算法知识视频讲解
\hspace{15pt}对于给定的 nm 列的矩阵,每一个元素要么是 \texttt{`0'},要么是 \texttt{`1'}
\hspace{15pt}每一轮,你可以进行一次以下操作:
\hspace{23pt}\bullet\,选择一行的元素,将其全部反置,即 \texttt{`0'} 变为 \texttt{`1'}\texttt{`1'} 变为 \texttt{`0'}
\hspace{15pt}请你帮助小歪判断,若能进行任意多轮操作(也可以不进行操作),至多能使得多少列的元素均为 \texttt{`1'}。你只需要输出这个最大值。

输入描述:
\hspace{15pt}第一行输入两个正整数 n,m\left(1\leqq n,m\leqq 3 \times 10^3\right) 代表矩阵的行数和列数。
\hspace{15pt}此后 n 行,每行输入一个长度为 m 、仅由 \texttt{`0'}\texttt{`1'} 构成的字符串,代表矩阵每一行中的元素。


输出描述:
\hspace{15pt}输出一个整数,表示至多能使得多少列的元素均为 \texttt{`1'}
示例1

输入

3 4
1111
1111
1111

输出

4

说明

\hspace{15pt}在这个样例中,不需要进行操作,所有列的元素均为 \texttt{`1'}
示例2

输入

3 2
01
10
11

输出

1

说明

\hspace{15pt}在这个样例中,我们可以选择对第一行进行操作,使得第一行变为 \texttt{,此时,第一列的元素均为 \texttt{`1'}
难受,用golang超时。
package main

import (
    "fmt"
)

func main() {
    var n, m int
    fmt.Scanf("%d %d", &n, &m)

    grid := make([]string, n)
    for i := 0; i < n; i++ {
        fmt.Scanf("%s", &grid[i])
    }

    colBytes := make([]byte, n) // 复用
    count := make(map[string]int)

    for j := 0; j < m; j++ {
        for i := 0; i < n; i++ {
            colBytes[i] = grid[i][j]
        }
        count[string(colBytes)]++
    }

    maxCount := 0
    for _, c := range count {
        if c > maxCount {
            maxCount = c
        }
    }

    fmt.Println(maxCount)
}


发表于 2025-09-06 21:55:02 回复(0)