java实现:小明和小红正在玩一个游戏,这个游戏的规则是这样的: 给定一个01串,每个人进行操作时都可以消去若干个连续(可以只有一个)的0或者1。 两人轮流进行操作,直到01串被完全消去,最后消去最多1的那个人获胜。 小明为了体现自己的绅士风度,每次让小红优先进行操作,然后他再进行操作。 现在小红想知道游戏结束时她能消去多少1,你能高效的帮她算一下这个数吗? 注:不考虑博弈的情况,两个人每次操作时都会贪心地考虑当前步的最优操作(优先考虑消去1),不会考虑全局的影响。 Input Format 第一行是一个整数 ,表示该输入包含 个样例。 剩下的 行,每行都有若干个01组成。 Output Format 行,每行表示该输入下,小红能预期得到多少分
时间: 2024-04-21 16:29:05 浏览: 174
这道题可以用一个简单的贪心算法来解决。每次小红都优先消去尽可能多的连续的1,因为这样可以让小明面对更多的0,从而让小明的得分更低。具体步骤如下:
1. 统计输入的01串中连续的1的个数。可以用一个数组来存储,数组的第i个元素表示第i个位置开始,连续的1的个数。
2. 对于每个输入的01串,按照连续的1的个数从大到小排序。
3. 初始化小红的得分为0。然后依次遍历排序后的01串,每次取出连续的1的个数最多的那个01串。如果这个01串中的1已经全部被消去了(即连续的1的个数为0),则跳过这个01串。
4. 如果小红是偶数次操作(也就是小明的操作),则把当前01串中剩余的0全部消去。否则,把当前01串中剩余的1全部消去,并把消去的1的个数累加到小红的得分中。
5. 最后输出小红的得分即可。
Java代码如下:
相关问题
java代码实现:小明和小红正在玩一个游戏,这个游戏的规则是这样的: 给定一个01串,每个人进行操作时都可以消去若干个连续(可以只有一个)的0或者1。 两人轮流进行操作,直到01串被完全消去,最后消去最多1的那个人获胜。 小明为了体现自己的绅士风度,每次让小红优先进行操作,然后他再进行操作。 现在小红想知道游戏结束时她能消去多少1,你能高效的帮她算一下这个数吗? 注:不考虑博弈的情况,两个人每次操作时都会贪心地考虑当前步的最优操作(优先考虑消去1),不会考虑全局的影响。 Input Format 第一行是一个整数 ,表示该输入包含 个样例。 剩下的 行,每行都有若干个01组成。 Output Format 行,每行表示该输入下,小红能预期得到多少分
以下是 Java 代码实现:
```java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int t = scanner.nextInt();
scanner.nextLine();
for (int i = 0; i < t; i++) {
String s = scanner.nextLine();
int count = 0;
int len = s.length();
for (int j = 0; j < len; j++) {
if (s.charAt(j) == '1') {
count++;
}
}
if (count % 2 == 0) {
System.out.println(count / 2);
} else {
System.out.println((count - 1) / 2);
}
}
scanner.close();
}
}
```
思路解析:
1. 对于每个测试用例,统计字符串中1的个数。
2. 如果1的个数为偶数,那么小红最多消去的1的个数为1的个数的一半。
3. 如果1的个数为奇数,那么小红最多消去的1的个数为1的个数减1的一半。
时间复杂度:$O(n)$,其中 $n$ 是字符串的长度。
UML转换 根据UML写出对应的代码,为给定的类编写相应的无参数的构造方法和带参数的构造方法,以及修改和访问每个属性的方法,并在main方法中进行实例化。 ————————— | Student | |————————| |-name:String | |-age:int | |-sex: char
好的,根据您给出的UML类图,这是对应的Java代码实现:
```java
public class Student {
private String name;
private int age;
private char sex;
// 无参数构造方法
public Student() {
}
// 带参数的构造方法
public Student(String name, int age, char sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
// 修改和访问name属性的方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 修改和访问age属性的方法
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// 修改和访问sex属性的方法
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
// main方法中进行实例化
public static void main(String[] args) {
// 无参数构造方法实例化对象
Student s1 = new Student();
s1.setName("小明");
s1.setAge(18);
s1.setSex('男');
System.out.println(s1.getName() + " " + s1.getAge() + " " + s1.getSex());
// 带参数的构造方法实例化对象
Student s2 = new Student("小红", 20, '女');
System.out.println(s2.getName() + " " + s2.getAge() + " " + s2.getSex());
}
}
```
上面的代码实现了对应的UML类图,定义了一个名为`Student`的类,包含了`name`、`age`和`sex`三个属性,以及对应的访问和修改这三个属性的方法。同时实现了一个无参数构造方法和一个带参数的构造方法,以便在实例化对象时进行选择。在main方法中,我们首先通过无参数构造函数实例化了一个对象,并调用了相应的修改属性和访问属性的方法,接着我们通过带参数的构造方法实例化了另外一个对象,并展示了如何直接访问属性的值。
阅读全文