问题描述:小红拿到了一个矩阵,初始有一些格子被染成了黑色。现在小红希望把最多k个未被染成黑色的格子染成红色,具体的计分方式为是:如果一个红色格子下方相邻的格子也是红色,那么这个红色格子可以得1分。小红想知道,最多可以得到多少分?
输入描述:
第一行输入3个正整数,n,m,k分别代表矩阵的行数、列数以及小红最多可以染色的格子数量。
接下来的n行,每行输入一个长度为m的字符串,用来表示矩阵的初始染色情况,*字符表示黑色,o字符表示白色
1<=n,m<=1000
1<=k<=n*m
输出描述:
一个整数,代表小红可以获得的最大分数。
样例输入:
4 4 3
*o*o
oooo
****
oooo
样例输出:
1
参考答案:
public class 小红的矩阵染色 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();//行数
int m = scanner.nextInt();//列数
int k = scanner.nextInt();//最多染色的格子数量
char[][] grid = new char[n][m];
for (int i=0;i<n;i++){
String row = scanner.next();
grid[i] = row.toCharArray();
}
List<Integer> continueWhite = new ArrayList<>();
int cnt = 0;
for(int j = 0;j<m;j++){
for (int i = 0;i<n;i++){
if(grid[i][j] == 'o'){
cnt++;
}else{
continueWhite.add(cnt);
cnt = 0;
}
}
continueWhite.add(cnt);
cnt = 0;
}
continueWhite.sort(Collections.reverseOrder());
int point = 0;
if(continueWhite.get(0) == 1){
System.out.println(0);
return;
}else{
for(int i = 0;i<continueWhite.size();i++){
if(continueWhite.get(i)<k){
point = point + continueWhite.get(i)-1;
k = k - continueWhite.get(i);
}else {
point = point + k-1;
break;
}
}
}
System.out.println(point);
}
}
问题描述:小红定义一个字符串是轴对称的,当且仅当该字符串反转后和原串相同。
例如,bod、pwq、ovo等字符串是轴对称的,而ntn不是轴对称的字符串。
提示:单个轴对称的字母有"ilmnouvwx" ;一对相互轴对称的字母有"pq"、“bd”
输入描述:
第一行输入一个正整数n,代表询问次数。
接下来的n行,每行输入一个仅由小写字母组成的字符串。长度不超过100.
1<=n<=10
输出描述:
如果该字符串轴对称,则输出“Yes”。否则输出“No”
样例输入:
2
bpovoqd
bbbb
样例输出:
Yes
No
参考答案:
public class 小红的对称串 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();//询问次数
while (n > 0) {
String str = scanner.next();
if (isAxialSymmetry(str)) System.out.println("Yes");
else System.out.println("No");
n--;
}
}
public static boolean isAxialSymmetry(String s) {
int len = s.length();
String axialSymmetryString = "ilmnouvwx";
//如果是字符串个数是奇数
if (len % 2 != 0) {
if (axialSymmetryString.contains(s.charAt(len / 2) + "")) {
for (int i = 0; i < len / 2; i++) {
if (s.charAt(i) == 'b' && s.charAt(len - 1 - i) == 'd') {
continue;
} else if (s.charAt(i) == 'd' && s.charAt(len - 1 - i) == 'b') {
continue;
} else if (s.charAt(i) == 'p' && s.charAt(len - 1 - i) == 'q') {
continue;
} else if (s.charAt(i) == 'q' && s.charAt(len - 1 - i) == 'p') {
continue;
} else if (axialSymmetryString.contains(s.charAt(i) + "") && s.charAt(i) == s.charAt(len - 1 - i)) {
continue;
}
else {
return false;
}
}
return true;
} else {
return false;
}
}
//如果是字符串个数是偶数
else {
for (int i = 0; i < len / 2; i++) {
if (s.charAt(i) == 'b' && s.charAt(len - 1 - i) == 'd') {
continue;
} else if (s.charAt(i) == 'd' && s.charAt(len - 1 - i) == 'b') {
continue;
} else if (s.charAt(i) == 'p' && s.charAt(len - 1 - i) == 'q') {
continue;
} else if (s.charAt(i) == 'q' && s.charAt(len - 1 - i) == 'p') {
continue;
} else if (axialSymmetryString.contains(s.charAt(i) + "") && s.charAt(i) == s.charAt(len - 1 - i)) {
continue;
}else {
return false;
}
}
return true;
}
}
}
问题描述:
平面直角坐标系内有一点P,小红希望你构造一个圆满足以下两个条件:
1.圆和两个坐标轴都相切。
2.圆经过点P
显然,一共有两个合法的解,你需要从小到大输出这两个解的圆的半径。
输入描述:
两个正整数xp和yp,代表点p的坐标
输出描述:
从小到大两个浮点数,分别代表两个解的圆的半径。
样例输入:
1 2
输出:
1.0000 5.0000
参考答案:
public class 小红的圆构造 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int xp = scanner.nextInt();
int yp = scanner.nextInt();
//求解半径r的方程为r²-2(x+y)r+x²+y²=0
int a = 1;
int b = -2 * (xp + yp);
int c = xp * xp + yp * yp;
double r1 = (-b - Math.sqrt(b * b - 4 * a * c)) / (2 * a);
double r2 = (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a);
System.out.println(r1 + " " + r2);
}
}