“当每个红色的格子其下方的格子也为红色是得1分” -> 在垂直方向上连续k个空白格子最多可以得到k-1分
统计所有垂直方向上连续的空白格子,考虑到优先涂最长的格子是最优的,将空白格子长度逆序排序后遍历即可
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 int n = in.nextInt(); int m = in.nextInt(); int k = in.nextInt(); String[] strs = new String[n]; for(int i = 0;i < n;i ++){ strs[i] = in.next(); } ArrayList<Integer> list = new ArrayList<>(); for(int i = 0;i < m;i++){ int count = 0; for(int j = 0;j < n;j++){ if(strs[j].charAt(i) == 'o')count ++; //检索所有上下连续的格子 else{ list.add(count); count = 0; } } list.add(count); } list.sort(Comparator.reverseOrder());//从高到低排序 int result = 0; for(int length : list){ if(k > length){ //当前可以染色所有的格子 result += length - 1; k -= length; } else{ //只能染部分格子,得分为当前染色数-1 result += k - 1; break; } } System.out.print(result); } }