解题思路:
当我们从头遍历时,要明白一点是,不要考虑前面的位置,有点动态规划的想法,即前面做的已经是最对的了,前面已经把当前的考虑进去了(代码有所体现),所以我们只考虑当前位置及以后。
当前位置只能影响我们的下一位置,影响不到下下位置
理由:因为当我们认为我们当前位置可以影响到下一位置时,潜意识里就认为,可能我们放弃当前位置组成字串时,后面可以组成更多的字串,但事实并不是这样,
当前位置放弃后,顶多会使我们的下一位置与下下位置组成字串,即多一个字串,那既然要多一个字串,为什么我们不利用当前字符,而是选择下一个呢?
注意事项:
无
参考代码:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.*;
public class Main {
public static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
public static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
public static StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
public static PrintWriter count = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws Exception {
String s = Line();
//遇到?在进行操作即可 首先我们要明白 一个数只能存在一个字串里面 不能在两个字串扮演角色
//那会不会出现这样的 1?00001 这种 假如我们选择?为1 有三个字串 选择?为0 却只有两个
//选择贪心算法 优先匹配第一个即可 因为你选择不匹配第一个就意味着你丢弃了一个字符串 除非你丢弃的结果是你可以凑出来两个 不可能嘛
int sum = 0;
for (int i = 0; i < s.length() - 1; i++) {
//我只担心我的下一个
char c = s.charAt(i);
if (c == '1') {
char cc = s.charAt(i + 1);
if (cc == '1' || cc == '?') {
sum++;
i++;
//这个数不再考虑
}
} else if (c == '0') {
char cc = s.charAt(i + 1);
if (cc == '0' || cc == '?') {
sum++;
i++;
//这个数不再考虑
}
} else if (c == '?') {
//优先凑成
sum++;
i++;
}
}
count.print(sum);
closeAll();
}
public static int nextInt() throws Exception {
cin.nextToken();
return (int) cin.nval;
}
public static long nextLong() throws Exception {
cin.nextToken();
return (long) cin.nval;
}
public static double nextDouble() throws Exception {
cin.nextToken();
return cin.nval;
}
public static String nextString() throws Exception {
cin.nextToken();
return cin.sval;
}
public static String Line() throws Exception {
String p = "";
p = in.readLine();
return p;
}
public static void closeAll() throws Exception {
count.close();
in.close();
out.close();
}
}
0.0分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复