小红想知道,最多可以得到多少分?
第一行输入三个正整数,代表矩阵的行数和列数、以及小红最多可以染色的格子数量。
接下来的行,每行输入一个长度为
的字符串,用来表示矩阵的初始染色情况。'*'字符代表黑色,'o'字符代表白色。
一个整数,代表小红可以获得的最大分数。
4 4 3 *o*o oooo **** oooo
1
将矩阵染色成如下样式即可('r'代表红色):*r*ooroo****oooo
3 3 3 *o* *o* *o*
2
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 矩阵行数
int m = sc.nextInt(); // 矩阵列数
int k = sc.nextInt(); // 最多可染色的格子数
char[][] matrix = new char[n][m];
// 读取矩阵数据
for (int i = 0; i < n; i++) {
matrix[i] = sc.next().toCharArray();
}
List<Integer> blockLengths = new ArrayList<>();
// 按列遍历,找出所有垂直连续的白色块(长度≥2)
for (int j = 0; j < m; j++) { // 遍历每一列
int currentBlockLength = 0; // 当前连续白色块的长度
for (int i = 0; i < n; i++) { // 遍历列中的每一行
if (matrix[i][j] == 'o') { // 遇到白色格子,增加块长度
currentBlockLength++;
} else { // 遇到非白色格子(黑色)
// 若当前块长度≥2,记录下来(只有≥2的块才能产生得分)
if (currentBlockLength >= 2) {
blockLengths.add(currentBlockLength);
}
currentBlockLength = 0; // 重置块长度
}
}
// 处理列末尾可能存在的连续白色块
if (currentBlockLength >= 2) {
blockLengths.add(currentBlockLength);
}
}
// 按块长度从大到小排序(优先处理长块,能产生更多得分)
Collections.sort(blockLengths, Collections.reverseOrder());
int score = 0;
// 遍历所有块,计算最大得分
for (int length : blockLengths) {
if (k == 0) break; // 染色次数用尽,退出
// 取当前块长度与剩余染色次数的较小值(最多染这么多格子)
int cellsToDye = Math.min(k, length);
// 只有染色数≥2时才能产生得分(连续2个格子产生1分,3个产生2分,以此类推)
if (cellsToDye >= 2) {
score += cellsToDye - 1;
}
k -= cellsToDye; // 消耗染色次数
}
System.out.println(score);
}
}
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String[] first = reader.readLine().split(" ");
int n = Integer.parseInt(first[0]);
int m = Integer.parseInt(first[1]);
int k = Integer.parseInt(first[2]);
char[][] matrix = new char[n][m];
for(int i = 0; i < n; i++) {
matrix[i] = reader.readLine().toCharArray();
}
int[] frequence = new int[n+1];
for(int i = 0; i < m; i++){
int start = 0;
while(start < n) {
if(matrix[start][i] == '*') {
start++;
} else {
int end = start + 1;
while(end < n && matrix[end][i] == 'o') {
end++;
}
frequence[end-start]++;
start = end;
}
}
}
int max = 0;
for(int length = n; length > 1 && k > 0; length--){
for(int i = 0; i < frequence[length]; i++) {
if (k > length) {
max += length - 1;
k -= length;
} else {
max += k - 1;
k = 0;
break;
}
}
}
System.out.println(max);
}
} #include <iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n, m, k, score = 0;
cin >> n >> m >> k;
vector<string> vec(n);
for (int i = 0; i < n; i++)
cin >> vec[i];
vector<int> white;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (white.empty())
white.push_back(0);
if (vec[j][i] == '*') {
if (white.back() < 2)
white.pop_back();
white.push_back(0);
continue;
}
white.back()++;
}
if (!white.empty()&&white.back() < 2)
white.pop_back();
white.push_back(0);
}
white.pop_back();
sort(white.begin(), white.end(), [](auto const & a, auto const & b) {
return a > b;
});
for (int num : white) {
if (num >= k){
score += k - 1;
break;
}
else {
k -= num;
score += num - 1;
}
}
cout << score;
} import sys
a = [ i.replace('\n','') for i in list(sys.stdin)]
n,m,k = tuple(map(int,a[0].split(' ')))
a.pop(0)
max_o = []
score = 0
for j in range(m):
count = 0
for i in range(n):
if a[i][j] == 'o':
count += 1
else:
max_o.append(count)
count = 0
continue
max_o.append(count)
max_o = sorted(max_o,reverse=True)
for j in range(len(max_o)):
max_geze = max_o[j]
if k==0&nbs***bsp;max_geze == 0:
break
if k > 0:
if k > max_geze:
score += max_geze-1
k -= max_geze
else:
score += k-1
k = 0
print(score)